TCP:Transmission Control Protocol -> 传输控制协议,顾名思义,就是对数据的传输进行一定的控制。
tcp的报头如下所示:
每部分的含义如下:
16位源端口号:数据从哪个进程来
16位目标端口号:数据到哪个进程去
32位序列号:传输数据时,需要携带的标识
32位确认序号:传输数据时,需要携带的确认标识
4位首部长度:该tcp报头有多少个 4字节
6位保留:保留使用
URG:标识紧急指针是否有效
ACK:标识确认序号是否有效
PSH:用来提示接收端应用程序立刻将数据从tcp缓冲区读走
RST:要求重新建立连接 -> 我们把含有RST标识的报文称为复位报文段
SYN:请求建立连接 -> 我们把含有SYN标识的报文称为同步报文段
FIN:通知对端,本端即将关闭 -> 我们把含有FIN标识的报文称为结束报文段
16位窗口大小:
16位检验和:由发送端填充,检验形式有CRC校验等. 如果接收端校验不通过, 则认为数据有问题. 此处的校验和不光包含TCP首部, 也包含TCP数据部分。
16位紧急指针:用来标识哪部分数据是紧急数据
选项:
数据:
tcp三次握手:
第一次握手:
客户端主动请求连接,将标志位SYN置为1,并随机产生一个序列号J,然后将这个数据包发送给服务器,进入SYN_SENT的状态,等待服务器的确认。
第二次握手:
服务器收到客户端的数据包后,解包发现SYN为1,知道客户端要请求连接,然后服务器也需要向客户端请求连接,并确认客户端发的连接请求,即将SYN置为1,并随机产生一个序列号K,将ACK置为1,ack置为J+1,然后将这个数据包发送给客户端,随即进入SYN_RCVD状态。
第三次握手:
客户端收到服务器的数据包后,解包发现SYN为1,ACK为1,ack为J+1,知道服务器已经收到自己的请求连接数据包,并且同意连接,然后客户端向需要服务器发送确认信息,即将ACK置为1,ack置为K+1,然后将数据包发送给服务器,随即进入ESTABLISHED状态。
当服务器收到客户端对自己发送数据包的确认时,也进入ESTABLISHED状态。
tcp四次挥手:
由于tcp的连接是全双工的,因此每一个方向都需要进行单独的关闭。
第一次挥手:
客户端将FIN置为1,其序列号M(等于前面已经传输过来的数据的最后一个字节的序号+1),将这个数据包发送给服务器,然后进入FIN_WAIT_1状态。
第二次挥手:
服务器收到结束报文段后,需要发出确认数据包,即将ACK置为1,ack为序列号M+1,然后进入CLOSE_WAIT状态。
第三次挥手:
服务器将FIN置为1,随机产生一个序列号N,将这个数据包发送给客户端(用来结束服务器向客户端的数据传输),然后进入LAST_ACK状态。
第四次挥手:
客户端收到服务器的结束报文后,进入TIME_WAIT状态,并向服务器发送确认报文,将ACK置为1,ack置为N+1