本篇博客主要讲述 TCP的三次握手和四次挥手的过程以及TCP报头。
一、TCP三次握手
TCP是面向连接的服务,三次握手正是它创建链接的一个过程。它是在listen 之后开始,由内核进行监听。
(1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。
(2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。
(3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。
二、TCP四次挥手
TCP四次挥手是它断开链接的一个过程。客户端与服务器端都可以主动的发起挥手动作。也就是说,任意一方执行close()都可以进行此操作(socket编程中)。
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
三、TCP三次握手四次挥手状态图
分割线以上是三次握手的状态图
分割线以下是四次挥手后状态图
四、TCP报头
1、16位源/目的端口号:告知主机该报文时来自哪里(源端口)以及给哪个上层协议或应用程序(目的端口)的。进行TCP通信时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号。
2、32位序号:TCP连接建立到断开过程中某一个传输方向上的字节流的每个字节的编号。
3、32位确认号:用作对另一方发送来的TCP报文段的响应,其值是收到的TCP报文段的序号值加1.
4、4位头部长度:标识该TCP头部的字节,最长为60字节。
5、16位窗口大小:TCP流量控制的一个手段。窗口值得是接收通告窗口。它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
6、16位校验和:由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在数据传输中是否损坏。
7、16位紧急指针:是一个正的偏移量,它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。它是发送端向接收端发送紧急数据的方法。