文章目录
1 什么是TCP协议
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 定义。
2 三次握手、四次挥手
2.1 TCP三次握手过程
2.1.1 学习了解
1 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
2 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
3 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
2.1.2 抓包验证
创建连接
1 192.168.3.96:55584 -> 110.242.68.4:80 客户端发送【SYN】(Seq=x)报文给服务端
2 110.242.68.4:80 -> 192.168.3.96:55584 服务端收到【SYN】报文,回应一个【SYN ACK】报文 (Seq=y, Ack=x+1)
3 192.168.3.96:55584 -> 110.242.68.4:80 客户端收到服务端的【SYN ACK】报文,回应一个【ACK】报文(Seq=x+1,Ack=y+1)
2.1.3 画图
2.2 TCP四次挥手过程
2.2.1 学习了解
(1) 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN报文,表示数据发送完毕。
(2) 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。
注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
(3) 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
(4) 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。
2.2.2 抓包验证
断开连接
1 192.168.3.96:55584 -> 110.242.68.4:80 客户端关闭连接,发送【FIN, ACK】报文给服务端(Seq=u,Ack=y),这个ACK不确定是干什么的
2 110.242.68.4:80 -> 192.168.3.96:55584 服务端收到客户端的【FIN, ACK】报文,回应一个【ACK】报文(Seq=v,Ack=u+1)
3 110.242.68.4:80 -> 192.168.3.96:55584 服务端发送【FIN, ACK】报文给客户端(Seq=w,Ack=u+1)
4 192.168.3.96:55584 -> 110.242.68.4:80 客户端收到服务端发送的【FIN,ACK】报文,回应一个【ACK】报文(Seq=u+1,Ack=w+1)给服务端
2.2.3 画图
3 TCP首部格式
TCP虽然是面向字节流的,但TCP传送的数据单元却是报文段。一个TCP报文段分为首部和数据两部分,而TCP的全部功能体现在它首部中的各字段的作用。
TCP报文段首部的前20个字节是固定的(下图),后面有4n字节是根据需要而增加的选项(n是整数)。因此TCP首部的最小长度是20字节。