TCP三次握手和四次挥手过程及常见面试题

1.三次握手
在这里插入图片描述
服务器端状态转换:

  • [CLOSED->LISTEN]服务端调用listen后进入LISTEN状态,等待客户端连接.
  • [LISTEN->SYN_RCVD]一旦监听到连接请求(同步报文段),就将改连接放入内核等待队列中,并向客户端发送SYN确认报文.
  • [SYN_RCVD->ESTABLISHED]服务端一旦接收到客户端的确认报文,就进入ESTABLISHED状态,可以进行读写数据了.

客户端状态转换:

  • [CLOSED->SYN_SENT]客户端调用connect,发送同步报文段.
  • [SYN_SENT->ESTABLISHED]connect调用成功,则进入ESTABLISHED状态,开始读写数据.

最初两端的TCP进程都处于CLOSED关闭状态,客户端主动发起连接请求,服务器端被动连接。
(1)第一次握手:客户端向服务器端发起连接请求报文段,(首部的同步为SYN=1),此时TCP客户端进入SYN_SENT状态。
(2)第二次握手:服务器端收到连接请求报文后,如同意连接请求,则向客户端发送确认报文段(SYN=1,ACK=1),服务器端进入SYN_RCVD状态。
(3)第三次握手:TCP客户端收到服务器端的确认后,要向服务器端发送确认报文段(ACK=1),TCP连接已经简历,客户端进入ESTABLISHED状态.
2.四次挥手过程
在这里插入图片描述
服务端状态转换:

  • [ESTABLISHED->CLOSE_WAIT]当客户端主动关闭连接(调用close),服务器会收到结束报文段,服务器返回确认报文段并进入CLOSE_WAIT;
  • [CLOSE_WAIT->LAST_ACK]进入CLOSE_WAIT后说明服务器准备关闭连接(需要处理完之前的数据);当服务器真正调用close关闭连接时,会向客户端发送FIN,此时服务器进入LAST_ACK状态,等待最后一个ACK到来.
  • [LAST_ACK->CLOSED]服务器收到了对FIN的ACK,彻底关闭连接

客户端状态转换:

  • [ESTABLISHED->FIN_WAIT1]客户端主动调用close时,向服务器发送结束报文段,同时进入FIN_WAIT1;
  • [FIN_WAIT1->FIN_WAIT_2]客户端收到服务器对结束报文段的确认,则进入FIN_WAIT_2,开始等待服务器的结束报文段;
  • [FIN_WAIT_2->TIME_WAIT]客户端收到服务器发来的结束报文段,进入TIME_WAIT,并发出LAST_ACK;
  • [TIME_WAIT->CLOSED]客户端要等待一个2MSL(报文最大生存时间)的时间,才会进入CLOSED状态.

理解TIME_WAIT状态

  • tcp协议规定,主动关闭连接的一方要处于TIME_WAIT状态,等待2MSL的时间后才能回到CLOSED状态.
  • 当我们使用CTRL+c终止了server,所以server是主动关闭的一方,在TIME_WAIT期间仍然不能再次监听同样的server端口.

常见面试题

  • 为什么TIME_WAIT的时间是2MSL
    1.MSL是TCP报文的最大生存时间,因此TIME_WAIT持续存在2MSL的话就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启,可能会收到来自上一个进程迟到的数据,但是这种数据可能是错误的);
    2.同时也是在理论上保证最后一个报文可靠到达(假设一个ACK丢失,那么服务器会再重发一个FIN,这时虽然客户端的进程不在了,但是TCP连接还在,仍然可以重发LAST_ACK).

  • 为什么连接的时候是三次握手,断开的时候却是四次挥手

    因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值