一.TCP/IP 网络分层
TCP 是一个可靠的(reliable)、面向连接的(connection-oriented)、基于字节流(byte-stream)、全双工(full-duplex)的协议。发送端在发送数据以后启动一个定时器,如果超时没有收到对端确认会进行重传,接收端利用序列号对收到的包进行排序、丢弃重复数据,TCP 还提供了流量控制、拥塞控制等机制保证了稳定性。
通过wireshark抓包工具可以看到以下几个重要的部分
Ethernet II:网络接口层以太网帧头部信息
Internet Protocol Version 4:互联网层 IP 包头部信息
Transmission Control Protocol:传输层的数据段头部信息,此处是 TCP 协议
Hypertext Transfer Protocol:应用层 HTTP 的信息
1.HTTP 协议应用层
起始行 GET/HTTP/1.1
首部
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
Accept: application/json, text/javascript, /; q=0.01
实体 空
其他应用层协议 DNS ,SMTP,POP3,NTP,NFS
2.传输层
传输层的作用是为两台主机之间的「应用进程」提供端到端的逻辑通信,传输层用端口号来标识不同的应用程序
3.网络互连层(Internet Layer)
IP 协议是网络层的主要协议,TCP 和 UDP 都是用 IP 协议作为网络层协议。这一层的主要作用是给包加上源地址和目标地址,将数据包传送到目标地址。
4.网络访问层(Network Access Layer)
也叫网络接口层,以太网、Wifi、蓝牙工作在这一层,网络访问层提供了主机连接到物理网络需要的硬件和相关的协议。
分层结构图
二.TCP三次握手
1.客户端:
1.默认CLOSED状态
2.客户端调用connect发送SYN同步报文给服务端,进入SYN-SEND状态,直到收到服务端的确认包
3.在SYN-SEND状态收到服务端的确认包后,发送确认服务端SYN报文的ACK包,进入ESTABLISHED状态,准备发送数据
2.服务端:
1.初始状态默认是CLOSED
2.服务端在调用listen后进入LISTEN状态 ,等待客户端的连接
3.在收到客户端的SYN报文后,回复确认ACK同时发送自己的SYN同步报文,进入SYN-RCVD状态,直到客户端的确认
4.在收到客户端的确认报文后,进入ESTABLISHED状态,此时双方可以传输数据,
三.四次挥手
客户端
1.调用close发送FIN报文,进入FIN-WAIT-1,此后不再发送数据给服务端
2.客户端收到ACK,进图FIN-WAIT-2
3.收到服务端的FIN后发送ACK,进入TIME-WAIT状态,等待2个MSL后进图CLOSED状态,完成断开服务端连接
服务端
1.收到FIN后回复ACK,进入CLOSE_WAIT
2.传输给客户端的数据都发送完毕后,发送FIN给客户端,此时进入LAST-ACK状态,等待客户端的ACK
3.收到ACK后进入CLOSED状态,完成断开客户端连接
四.半连接和全连接队列
半连接队列(SYN 队列):服务端收到客户端的 SYN 包,回复 SYN+ACK 但是还没有收到客户端 ACK 情况下,会将连接信息放入半连接队列。
全连接队列(Accept 队列):服务端完成了三次握手,但是还未被 accept 取走的连接队列。