2.TCP连接:三次握手四次挥手+状态迁移

1.为何采用这种连接建立/断开方式?
TCP是一种可靠的数据传输协议,可靠不只是报文收发的可靠,也是指连接的可靠,若是基本的连接可靠性无法保持,就不能确保报文传输的可靠性。

(1)为啥握手是三次?

  • 开始建立连接时,通信双方并无数据交互,是一个新的开始,因此只需要进行打招呼建立就行,比如A与B建立TCP连接过程:
    A:B你好啊,我要和你通信哦;
    B:好的,收到;
    A:我也收到。
    可见在三次通信过程中除了第一条A的请求消息外,剩下的都是A、B两端互相确认的过程,这就保证了双方确认连接建立成功。

(2)为啥挥手是四次?

  • 断链与建链的不同就在于,多了数据交互的过程,因此要保证数据处理完成才可断链:
    A:B你好,我传输完要关闭了;
    B:好的,收到,但是我还没处理完数据;
    B:数据处理完了,我关闭了;
    A:好的,我也关闭了。
    同建链过程,断链时也包含了A、B两端互相确认关闭的过程。

2.三次握手
TCP握手过程
状态变化:
客户端:
CLOSED -> SYN_SEND -> ESTABLISHED
服务端:
CLOSED -> LISTEN -> SYN_RCVD -> ESTABLISHED

3.四次挥手
TCP挥手过程
状态变化:
客户端:
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.csdn.net/bzfys/article/details/73733917

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值