TCP连接状态转换

什么是TCP

TCP是面向连接的可靠的数据包传递。针对不稳定的网络层做完全弥补,借助回执,丢包重传。

TCP三次握手
  1. 主动建立请求连接(客户端),发送SYN标志位,携带序号n
  2. 被动接受连接请求端(服务器),接收SYN标志位,回发ACK携带确认序号n+1。同时发送SYN标志位M。
  3. 主动建立请求连接(客户端),接收SYN标志位,回发ACK确认序号M+1

标志3次握手完成,对应应用层
客户端:Dial()
服务器:Accept()

TCP数据通信

发送端发送数据同时,携带序号。接收端,收到数据后需要给发送端发送ACK应答以及确认信号
确保TCP通信模式下,数据可靠的传输。

四次挥手

主动断开连接请求端(客户端),发送FIN标志位,携带序号。
被动断开连接请求端(服务器),接收FIN标志位,回发ACK应答。携带确认序号。
半关闭(半关闭后,客户端不发数据,发tcp包头)
主动断开连接请求端(服务器),发送FIN标志位,携带序号。
主动断开连接请求端(客户端),接收FIN标志位,回发ACK应答。携带确认序号。
关闭

TCP状态转换图:

主动连接端:
CLOSED->发送SYN->SYN_SENT->接收ACK、SYN,发送ACK->ESTABLISHED->数据通信
主动关闭端:
ESTABLISHED->发送FIN->FIN_WAIT_1->接收ACK->FIN_WAIT_2(半关闭)->接收FIN,发送ACK
->TIME_WAIT->等待2MSL时长->CLOSED

2MSL:为了确保tcp通信过程中的最后一个ACK能被对端收到,等待的一个时长(约40s在ubuntu,不同系统不一样)

FIN_WAIT_1、FIN_WAIT_2、 TIME_WAIT、 2MSL 只出现在主动端

被动连接端(服务器):
CLOSED->LISTEN->接收SYN,发送ACK,SYN->SYN_RCVD->接收ACK->ESTABLISHED->数据通信
被动关闭端(服务器):
ESTABLISHED->接收FIN,发送ACK->CLOSED_WAIT(对应主动端的FIN_WAIT_2)->发送FIN->
LAST_ACK->接收ACK->CLOSED
TCP连接状态转换_第1张图片

小结

tcp:三次握手、建立链接、4次挥手。

三次握手:syn , ack syn, ack

4次挥手:fin, ack, fin, ack

主动方:想关闭fin_wait1,发fin收ack fin_wait2,收fin发ack time_wait,2msl,关闭

fin_wait2是半关闭状态,只能收不能发数据

被动方:收fin发ack close_wait(对应fin_wait2) 发送

tcp是面向链接,使用的是流式传输,保证数据准确性,保证数据的顺序,通信成本相对较高

udp是面向无连接,使用数据包传输,通信成本相对较低。

你可能感兴趣的:(golang网络编程和文件处理)