简述TCP三次握手和四次挥手

TCP三次握手

在这里插入图片描述

  1. 服务器必须准备好接受外来的连接,通常通过调用socket、bind和listen完成,称之为被动打开(passive open)
  2. 客户端通过调用connect发起主动打开(active open)。客户TCP发送一个SYN(同步)分节,告诉服务器客户端将在(待建立的)连接中发送的数据的初始序列号。通常SYN分节不携带数据,所在IP数据报只含有一个IP首部、一个TCP首部及可能有的TCP选项
  3. 服务器必须确认(ACK)客户的SYN,同时自己也得发送一个SYN节点,含有服务器将在同一个连接中发送的数据的初始序列号,服务器在单个分节中发送SYN和对客户SYN的ACK(确认)
  4. 客户必须确认服务器的SYN

客户的初始序列号为J,服务器的初始序列号为K。ACK中确认号是发送这个ACK的一端所期待的下一个序列号。因为SYN占据一个字节的序列号空间,所以每一个SYN的ACK中的确认号就是该SYN的初始序列号加1.类似地,每一个FIN(表示结束)的ACK中的确认号为该FIN的序列号加1

TCP四次挥手

在这里插入图片描述

  1. 某个应用进程首先调用close,称该端执行主动关闭(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕
  2. 接收到这个FIN的对端执行被动关闭(passive close)。这个FIN由TCP确认。它的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程(放在已排队等候该应用进程接收的任何其他数据之后),FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收
  3. 接收到这个文件结束符的应用进程将调用close关闭它的套接字,导致它的TCP也发送一个FIN
  4. 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN

某些情况下步骤1的FIN随数据一起发送,另外,步骤2和步骤3发送的分节都出自执行被动关闭那一端,有可能被合并成一个分节。类似SYN,一个FIN也占据1个字节的序列号空间。每个FIN的ACK确认号就是这个FIN的序列号加1。在步骤2与步骤3之间,从执行被动关闭一端到执行主动关闭一端流动数据是可能的,称为半关闭。无论是客户还是服务器,任何一段都可以执行主动关闭。通常情况下是客户执行主动关闭,但是某些协议却由服务器执行主动关闭

当套接字被关闭时,其所在端TCP各自发送了一个FIN,这是由应用进程调用close而发送的,不过需认识到,无论是自愿的还是非自愿的终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接上也发出一个FIN。

TIME_WAIT状态

停留在这个状态的持续时间是最长分节生命期(maximum segment lifetime,MSL)的两倍,有时候称之为2MSL。
MSL是任何IP数据报能够在因特网中存活的最长时间。

TIME_WAIT状态存在的理由:

  1. 可靠地实现TCP全双工连接终止。保证客户端发送的最后一个ACK报文能够到到服务器,因为这个ACK报文可能丢失。客户端必须维护状态信息,以允许它重新发送最终那个ACK。

为什么执行主动关闭的那一端是处于TIME_WAIT状态的那一端?
因为可能不得不重传最终那个ACK的就是那一端

  1. 允许老的重复分节在网络中消逝。TIME_WAIT状态的持续时间是MSL的2倍,足以让某个方向上的分组最多存活MSL秒即被丢弃,另一个方向上的应答最多存活MSL秒也被丢弃,就能保证每成功建立一个TCP连接时,来自该连接前的老的重复分组都已在网络中消逝
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值