PHP网络编程
文章目录
【注意】最后更新于 October 25, 2022,文中内容可能已过时,请谨慎使用。
PHP网络编程
[[../../计算机基础【字节序,内存,补码】]] [[../../监听socket,连接socket]] [[../../粘包【封包-拆包】pack函数]]
tcp/ip协议簇
数据链路层:
接收到上层传来的数据,首先先拿到IP,再使用ARP程序发起一个请求,他会把IP包括自己的IP,自己的MAC地址进行封装后发送出去
网络上的主机接收到ARP请求时,判断IP是不是自己的,然后进行相应,把自己的IP,MAC发给对方。
然后把数据,MAC地址进行封装为数据帧 iframe 【 目的物理地址,源物理地址,数据。。。】
网络层:
ICMP:ping,iptables
接收数据时,判断数据是不是发给自己的,如果是,会传递到传输层,最终传递到应用层某个具体进程【进程具有数据读写能力。如果不是发给自己,会进行转发,ip_forward【LVS】
发送数据时:他会进行封装为IP数据报,传递到数据链路层
传输层
TCP/UDP
tcp:基于流stream的服务,特点:要进行连接,是双向的全双工,数据可靠,有序,超时重传
应用程序在收发数据时需要自己去判断数据的边界,会涉及到数据粘包和少报问题
udp:数据报服务,传输数据是固定的,但是不可靠,发送放发送一次,接收方必须及时接受,否则数据丢弃recvfrom
应用层
HTTP,MQTT,WEBSOCKET
应用层在实现的时候是调用操作系统提供的系统调用函数,socket api。
抓包:tcpdump工具
|
|
TCP报文结构
【S】 SYN 同步报文【连接报文】
【seq】 ISN序号值
【ack】确认报文
【P】
【FIN】结束报文
三次握手
|
|
服务端调用LISTEN函数处于listen状态
客户端调用connect函数发送SYN同步报文
服务器使用ACK确认报文,双方就处于ESTABLEISH状态