TCP状态详解
Posted yyxianren
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP状态详解相关的知识,希望对你有一定的参考价值。
报文结构
TCP标志位
标志位就是用于协议的一些机制的实现的比特位大家可以看到有6比特,它们依次如下:
URG、ACK、PSH、RST、SYN、FIN。
URG表示紧急指针字段有效;
ACK置位表示确认号字段有效;
PSH表示当前报文需要请求推(push)操作;
RST置位表示复位TCP连接;
SYN用于建立TCP连接时同步序号;
FIN用于释放TCP连接时标识发送方比特流结束。
都是1bit,1bit代表0和1,字段等于1确认有效
源端口和目的端口:各为16比特,用于表示应用层的连接。源端口表示产生数据包的应用层进程,而目的端口则表示数据包所要到达的目的进程。
序列号:为32比特,表示数据流中的字节数。序列号为首字节在整个数据流中的位置。初始序列号随机产生,并在连接建立阶段予以同步。
确认号:表示序号为确认号减去1的数据包及其以前的所有数据包已经正确接收,也就是说他相当于下一个准备接收的字节的序号。
头部信息:4比特,用于指示数据起始位置。由于TCP包头中可选项的长度可变,因此整个包头的长度不固定。如果没有附加字段,则TCP数据包基本长度为20字节。
窗口:16位,表示源端主机在请求接收端等待确认之前需要接收的字节数。它用于流量控制,窗口大小根据网络拥塞情况和资源可用性进行增减。
校验位:16位。用于检查TCP数据包头和数据的一致性。
紧急指针:16位。当URG码有效时只向紧急数据字节。
可选项:存在时表示TCP包头后还有另外的4字节数据。TCP常用的选项为最大数据包(并非整个TCP报文)MSS。每一个TCP段都包含一个固定的20字节的段头。TCP段头由20字节固定头和一些可选项组成。实际数据部分最多可以有65495(65535-20-20=65495)字节。
三次握手建立连接
第一次握手,client端将标志位SYN置位,序列号为随机数J,并将数据包发送给server。client进入SYN_SENT状态,等待服务端确认。
第二次握手,server端收到数据包后由标志位SYN=1知道client请求建立连接,server将标志位SYN和ACK都置位为1,确认位为ack=j+1,随机产生一个值seq=k,并将该数据包发送给client以确认连接请求,server进入SYN_RCVD状态。
第三次握手,client端收到数据包后,检查确认位是否为ack=j+1,标志位ACK位是否为1,若果正确把标志位ACK置位为1,序列号为seq=j+1,确认号为ack=K+1并将数据包发送给server,server端收到消息后检查确认位是否等于ack=k+1,标志位是否ACK=1,如果正确则连接建立成功,client和server进入ESTABLISHED窗台,完成三次握手,随后client和server之间可以开始传输数据了。
四次挥手拆除连接
四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
TCP十一种状态总结:
以上是关于TCP状态详解的主要内容,如果未能解决你的问题,请参考以下文章