TCP详解

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的状态,等待服务器的确认。

第二次握手:

服务器收到客户端的数据包后,解包发现SYN1,知道客户端要请求连接,然后服务器也需要向客户端请求连接,并确认客户端发的连接请求,即将SYN置为1,并随机产生一个序列号K,将ACK置为1ack置为J+1,然后将这个数据包发送给客户端,随即进入SYN_RCVD状态。

第三次握手:

客户端收到服务器的数据包后,解包发现SYN1ACK1ackJ+1,知道服务器已经收到自己的请求连接数据包,并且同意连接,然后客户端向需要服务器发送确认信息,即将ACK置为1ack置为K+1,然后将数据包发送给服务器,随即进入ESTABLISHED状态。

当服务器收到客户端对自己发送数据包的确认时,也进入ESTABLISHED状态。

 

tcp四次挥手:

 

由于tcp的连接是全双工的,因此每一个方向都需要进行单独的关闭。

第一次挥手:

客户端将FIN置为1,其序列号M(等于前面已经传输过来的数据的最后一个字节的序号+1),将这个数据包发送给服务器,然后进入FIN_WAIT_1状态。

第二次挥手:

服务器收到结束报文段后,需要发出确认数据包,即将ACK置为1ack为序列号M+1,然后进入CLOSE_WAIT状态。

第三次挥手:

服务器将FIN置为1,随机产生一个序列号N,将这个数据包发送给客户端(用来结束服务器向客户端的数据传输),然后进入LAST_ACK状态。

第四次挥手:

客户端收到服务器的结束报文后,进入TIME_WAIT状态,并向服务器发送确认报文,将ACK置为1ack置为N+1

posted @ 2019-05-09 19:54  c&z  阅读(551)  评论(0编辑  收藏  举报