1.为何采用这种连接建立/断开方式?
TCP是一种可靠的数据传输协议,可靠不只是报文收发的可靠,也是指连接的可靠,若是基本的连接可靠性无法保持,就不能确保报文传输的可靠性。
(1)为啥握手是三次?
- 开始建立连接时,通信双方并无数据交互,是一个新的开始,因此只需要进行打招呼建立就行,比如A与B建立TCP连接过程:
A:B你好啊,我要和你通信哦;
B:好的,收到;
A:我也收到。
可见在三次通信过程中除了第一条A的请求消息外,剩下的都是A、B两端互相确认的过程,这就保证了双方确认连接建立成功。
(2)为啥挥手是四次?
- 断链与建链的不同就在于,多了数据交互的过程,因此要保证数据处理完成才可断链:
A:B你好,我传输完要关闭了;
B:好的,收到,但是我还没处理完数据;
B:数据处理完了,我关闭了;
A:好的,我也关闭了。
同建链过程,断链时也包含了A、B两端互相确认关闭的过程。
2.三次握手
状态变化:
客户端:
CLOSED -> SYN_SEND -> ESTABLISHED
服务端:
CLOSED -> LISTEN -> SYN_RCVD -> ESTABLISHED
3.四次挥手
状态变化:
客户端:
ESTABLISHED -> FIN_WAIT1 -> FIN_WAIT22 -> TIME_WAIT -> CLOSED
服务端:
ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED
4.状态
- (1)LISTEN:服务端建立socket后进入该状态,负责新连接请求的监听;
- (2)SYN_SEND:发送syn报文后进入,表示已发起连接建立请求;
- (3)SYN_RCVD:收到syn报文后进入,表示收到请求端发送的请求报文;
- (4)ESTABLISHED:连接已建立状态,之后可以进行数据交互;
- (5)FIN_WAIT1:主动关闭端发送FIN报文后进入,表示已发送关闭请求,此时主动关闭端数据已经发送完成,但是还可以接收数据;
- (6)FIN_WAIT2:主动关闭端收到对端发送的ACK后进入,表示对端已经收到FIN报文,但是由于链路原因存在数据未处理完成情况,需等待对端处理完数据后发送关闭通知;
- (7)TIME_WAIT:主动关闭端收到对端发送的FIN报文后进入,表示对端数据处理完成,确认可以关闭;
- (8)CLOSING:该状态较少见,在FIN_WAIT1状态中直接收到FIN报文,则进入CLOSING状态(这里存在两种情况:case1:双方同时关闭,发送FIN;case2:由于链路原因,传输的FIN优先于第二次挥手的ACK报文到达),看起来像是少了一个挥手,变为三次;
- (9)CLOSE_WAIT:被动关闭端收到主动关闭端发送的FIN报文后进入,等待应用层处理未完成的数据;
- (10)LAST_ACK:被动关闭端发送FIN报文后进入,表示已处理完数据,等待关闭;
- (11)CLOSED:连接关闭状态。
5.问题:
(1)TIME_WAIT状态作用?
在FIN_WAIT2状态收到FIN后进入该状态,并发送最后一条挥手ACK信息,TIME_WAIT状态保持2MSL时长,保证在网络较差情况下客户端发送的ACK被服务端接收,以及ACK报文超时重传;
(2)半关闭?
FIN_WAIT2状态称为半关闭,此时主动关闭端已经停止发送数据,但是仍然可接收数据。
(3)…
推荐这篇,有些地方说的比较细致
https://blog.youkuaiyun.com/bzfys/article/details/73733917