TCP(一)三次握手和四次挥手

一、 TCP协议
1、 TCP(Transmission Control Protocol)传输控制协议是一种面向连接的、可靠的、基于字节流的传输层协议。
2、 TCP报文格式:

1)源端口(Source Port)
2)目的端口(Destination Port)
3)序列号(Sequence Number)

该字段用来标识TCP源端设备向目的端设备发送的字节流,它表示在这个报文段中的第几个数据字节。序列号是一个32位的数。
4) 确认号(Acknowledge Number)

TCP使用32位的确认号字段标识期望收到的下一个段的第一个字节,并声明此前的所有数据已经正确无误地收到,因此,确认号应该是上次已成功收到的数据字节序列号加1。收到确认号的源计算机会知道特定的段已经被收到。确认号的字段只在ACK标志被设置时才有效。
5) 数据偏移(Data Offset)

这个4位表示TCP首部大小。由于首部可能含有选项内容,因此TCP首部的长度是不确定的。首部长度的单位是4个字节。首部长度实际上也指示了数据区在报文段中的起始偏移值。
6) 保留(Reserved)

6位0的字段,为将来定义新的用途保留。
7) 控制位,

  • URG(Urgent Pointer Field Significant,紧急指针字段标志):表示TCP包的紧急指针字段有效,用来保证TCP连接不被中断,并且督促中间齐备尽快处理这些数据。
  • ACK(Acknowledgement field significant,确认字段标志): 取1时表示应答字段有效,也即TCP应答号将包含在TCP段中,为0则反之。
  • PSH(Push Function,推功能):这个标志表示Push操作。所谓Push操作就是指在数据包到达接收端以后,立即送给应用程序,而不是在缓冲区中排队。
  • RST(Reset the connection,重置连接):这个标志表示连接复位请求,用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包。
  • SYN(Synchronize sequence numbers,同步序列号):表示同步序号,用来建立连接。
  • FIN(No more data from sender):表示发送端已经发送到数据末尾,数据传送完成,发送FIN标志位的TCP段,连接将被断开。

8) 窗口(Window)

目的主机使用16位的窗口字段告诉源主机它期望每次收到的数据通的字节数。
9) 校验和(Checksum)

16位的校验和字段用于错误检查。
10) 紧急指针(Urgent Pointer)

紧急指针字段是一个可选的16位指针,指向段内的最后一个字节位置,这个字段只在URG标志被设置时才有效。
11) 选项(Option)

至少1字节的可变长字段,标识哪个选项(如果有的话)有效。
12) 填充(Padding)

这个字段中加入额外的零,以保证TCP头是32的整数倍。

二、三次握手
客户端和服务端之间开始传输数据前,需要通过三次握手建立TCP连接。
TCP三次握手的流程图:

  • 客户端发送建立连接请求给服务端,SYN=1,seq=x,之后进入SYN_SEND状态。
  • 服务端收到建立连接请求后,发送SYN=1,ACK=1,seq=y,ack=x+1,之后服务端进入SYN_RCVD状态。
  • 客户端收到回复后,发送ACK=1,seq=x+1,ack=y+1后,之后客户端状态进入ESTABLISHED状态。
  • 服务端接受到数据包后,服务端进入ESTABLISHED状态,至此TCP连接建立完。
  • 连接建立完成后,客户端和服务端就可以开始交互数据

三、四次挥手
  由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,
收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。

  • 客户端发送FIN=1,seq=x,请求关闭连接,然后进入FIN_WAIT1状态。
  • 服务端受到数据包后,回复ACK=1,seq=y,ack=x+1,并通知应用程序,然后服务端进入CLOSE_WAIT状态
  • 客户端收到ack后,进入FIN_WAIT2状态,此时客户端往服务端方向的连接关闭。
  • 服务端此时还可以继续发送数据给客户端,当服务端完成后续处理后,应用程序通知关闭连接,发送FIN=1,ACK=1,seq=w,ack=x+1,请求关闭服务端到客户端方向连接,并进入LAST_ACK状态。
  • 客户端收到数据包后,回复ACK=1,seq=x+1,ack=w+1,并进入TIME_WAIT状态,等待2MSL时间后,进入CLOSED状态,
  • 服务端收到ack后,进入CLOSED状态。
  • 至此,TCP连接完全关闭

四、TCP的11种状态转换

1、三次握手,绿色路径
1)客户端:CLOSED->SYN_SENT->ESTABLISHED
2)服务端:CLOSED->LISTEN->SYN_RCVD-> ESTABLISHED

2、四次挥手,灰色路径
1)客户端:ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT-> CLOSED
2)服务端:ESTABLISHED->CLOSE_WAIT->LAST_ACK-> CLOSED

3、其他路径
1) SYN_SENT在应用关闭或超时状态变为CLOSED
2) FIN_WAIT_1->CLOSING->TIME_WAIT,客户端发送FIN后,此时收到服务端的FIN并回ACK后,状态变更为CLOSING,客户端在收到服务端的ACK后,状态变更为TIME_WAIT。
3) FIN_WAIT_1->TIME_WAIT,客户端发送FIN后,此时收到服务端发送的FIN和ACK,客户端回复ACK后,状态变更为TIME_WAIT
4) SYN_SENT->SYN_RCVD,客户端在发送SYN的同时也收到服务器端的SYN请求,即两个同时发起连接请求,那么客户端就会从SYN_SENT转换到SYN_REVD状态

原文地址:https://www.cnblogs.com/guoxianqi2020/p/13684108.html