对TCP三次握手和四次挥手的理解

为啥有三次握手,这不得不提到TCP的特点了,它是面向连接的,可靠的协议。所以,需要三次握手,让通信双方建立一种可靠连接。

如果,我要客户端,你是服务器,下面,我要和你通信,就必须按照我们的协议来对暗号,这样我才把我知道告诉你。
[toc]

暗号:三次握手

[首先] 你是我的联络站,你的起始状态是监听Listen,而我是CLOSED

第一次握手:客户端(我)先发送一个SYN包(SYN = J,包的序号是J)给你,然后客户端进入SYN_SENT状态,等待服务器(你)的确认。

第二次握手:服务器(你)收到了我的SYN包以后,一定要确认我发的SYN包啊,所以,就回一个ACK=J+1,同时,你也要发一个SYN=K的包过来。此时,服务器进入SYN_RECV状态。

第三次握手:客户端(我)收到你的SYN+ACK包,向服务器发送确认包ACK=K+1,随机客户端认为建立完成,进入ESTABLISHED状态。服务端收到我的确认包以后,跟着也进入ESTABLISHED状态。

over,我们可以通情报了。

如果第三次握手失败了,怎么办?
这个时候,客户端(我)已经进入了ESTABLISHED状体,而服务端(你)还在SYN_RECV状态,等着我的ack,可能现在情况危急,我不方便发消息。

那么,服务端会启动自动重传,发送SYN包给我,如果超过自动重传还没有收到ACK,那么服务器会进入CLOSED状态,关闭连接。如果我发消息给服务端,服务端自动回复RST包,接着我判断收到了RST包自动关闭连接。

暗号:四次挥手

[首先] 我们都在ESTABLISHED状态。

第一次挥手:客户端(我)首先发送一个FIN = M包给服务器(finish),我主动进入FIN_WAIT_1状态。等你的finish包。

第二次挥手:服务器(你)收到了我的FIN 包以后,立马进入无论啥状况,都要回我一个ACK=M+1包,同时,可能你自己还有情报没有给我。所以,先进入CLOSE_WAIT

第三次挥手:客户端(我)收到你的ACK以后,我就进入FIN_WAIT_2状态,也就是半连接状态。当服务器(你)要发给我的数据都发完了,然后,发一个FIN = N包给我,服务器进入了LAST_ACK状态。

第四次挥手:客户端(我)收到你的FIN包以后,发送一个ACK=N+1包给你,我进入TIME_WAIT状态,等到时间到了好进入CLOSED状态。而你收到了我的ACK以后,服务端立马进入CLOSED状态。

传输报文长度

MSS 最大报文长度,TCP传输的。

MTU 最大传输单元

MSS是在三次握手的第三次确定的,前两次只是告知对方。

注,以太网的MTU为1500字节,Internet的MTU为576字节。所以,TCP传输的最大报文长度由具体传输网络决定。

例如,当MTU=1500时:
MSS = MTU - TCP_Head - IP_Head
= 1500 - 20 - 20
=1460

TCP三次握手中,accept函数是发生在TCP三次握手的那个阶段?

‘connect函数’主动打开,向客户端发送SYN=j包。

accept函数阻塞即发生在第二次握手。客户端发送完ack j+1 ,SYN=k以后,阻塞等待客户端返回ACK。

connect函数返回后,相当于给服务端发送了ACK,服务端收到ACK后,accept函数也解除阻塞,返回。
此时,进入了ESTABLISHED状态。

从这个过程可看到,connect函数参与了第一次和第三次握手,而accept函数参与了第二次握手。

Socket创建和TCP的三次握手关系

socket创建:
对TCP三次握手和四次挥手的理解

socket创建和tcp三次握手
对TCP三次握手和四次挥手的理解

参考: 徐晓鑫 后台开发:核心技术与应用实践。