什么是TCP
TCP是面向连接的可靠的数据包传递。针对不稳定的网络层做完全弥补,借助回执,丢包重传。
TCP三次握手
- 主动建立请求连接(客户端),发送SYN标志位,携带序号n
- 被动接受连接请求端(服务器),接收SYN标志位,回发ACK携带确认序号n+1。同时发送SYN标志位M。
- 主动建立请求连接(客户端),接收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:三次握手、建立链接、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是面向无连接,使用数据包传输,通信成本相对较低。