1. 四次挥手

  1. 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

  2. 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

  3. 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)

  4. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

  5. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。

  6. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

1.1 为什么FIN报文段即使不携带数据,也要消耗一个序号

例如 FIN 包不消耗一个序列号。客户端发送了 100 字节的数据包和 FIN 包,都等待服务端确认。如果这个时候客户端收到了ACK=1000 的确认包,就无法得知到底是 100 字节的确认包还是 FIN 包的确认包。

1.2 为什么要4次挥手

当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

如果服务端确定没有什么数据需要发给客户端,那么当然是可以把 FIN 和 ACK 合并成一个包,四次挥手的过程就成了三次。

1.3 同时关闭

  1. 当应用层发出关闭命令时,两端均从 E S TA B L I S H E D变为F I N _ WA I T _ 1。
  2. 这将导致双方各发送一个 F I N,两个F I N经过网络传送后分别到达另一端。
  3. 收到 F I N后,状态由F I N _ WA I T _ 1变迁到C L O S I N G,并发送最后的 A C K。当收到最后的 A C K时,状态变化为T I M E _ WA I T。

重学TCP协议(6) 四次挥手相关推荐

  1. 重学TCP协议(12)SO_REUSEADDR、SO_REUSEPORT、SO_LINGER

    1. SO_REUSEADDR 假如服务端出现故障,主动断开连接以后,需要等 2 个 MSL 以后才最终释放这个连接,而服务重启以后要绑定同一个端口,默认情况下,操作系统的实现都会阻止新的监听套接字绑 ...

  2. 重学TCP协议(11)TFO(Tcp Fast Open)

    1. TFO 为了改善web应用相应时延,google发布了通过修改TCP协议利用三次握手时进行数据交换的TFO(TCP fast open,RFC 7413). TFO允许在TCP握手期间发送和接收 ...

  3. 重学TCP协议(4) 三次握手

    1. 三次握手 请求端(通常称为客户)发送一个 S Y N段指明客户打算连接的服务器的端口,以及初始序号.这个S Y N段为报文段1. 服务器发回包含服务器的初始序号的 S Y N报文段(报文段2)作 ...

  4. 重学TCP协议(3) 端口号及MTU、MSS

    1. 端口相关的命令 1.1 查看端口是否打开 使用 nc 和 telnet 这两个命令可以非常方便的查看到对方端口是否打开或者网络是否可达.如果对端端口没有打开,使用 telnet 和 nc 命令会 ...

  5. 重学TCP协议(8) TCP的11种状态

    TCP的11种状态 为了逻辑更加清晰,假设主动打开连接和关闭连接皆为客户端,被动打开连接和关闭连接皆为服务端 客户端独有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 ...

  6. 重学TCP协议(10)SYN flood 攻击

    1.SYN flood 攻击 SYN Flood(半开放攻击)是一种拒绝服务(DDoS)攻击,其目的是通过消耗所有可用的服务器资源使服务器不可用于合法流量.通过重复发送初始连接请求(SYN)数据包,攻 ...

  7. 重学TCP协议(7) Timestamps 选项

    1.Timestamps 选项的组成部分 时间戳选项占10个字节= kind(1字节) + length(1字节) + info (8字节),其中kind=8,length=10,info由times ...

  8. 重学TCP协议(5) 自连接

    1.自连接是什么 在发起连接时,TCP/IP的协议栈会先选择source IP和source port,在没有显示调用bind()的情况下,source IP由路由表确定,source port由TC ...

  9. 重学TCP协议(9) 半连接队列、全连接队列

    1. 半连接队列.全连接队列基本概念 三次握手中,在第一步server收到client的syn后,把相关信息放到半连接队列中,同时回复syn+ack给client(第二步),同时开启一个定时器,如果超 ...

最新文章

  1. SQL Server 2008基于策略的管理
  2. 正则表达式中的字符类
  3. python编写姓名年龄_python小工具 - alert弹框输出姓名年龄、求和
  4. leetcode怎么用时间刷_刷完700多题后的首次总结:LeetCode应该怎么刷?
  5. MFC工具栏增加EditBox和Button
  6. 平时的鸿星尔克VS开挂后的鸿星尔克
  7. 限制checkbox复选框的最大可选数量
  8. 软件测试人员的三重境界
  9. 丁胖胖眼中的WINDOWS操作系统(一)
  10. 人生就是一次Presentation
  11. thinkphp5微信公众号推送模板消息
  12. Linux Kernel Patched
  13. Java 代码实现rar解压最全攻略操作
  14. 阿里云ACP认证哪个值得考?考试时间怎么安排?
  15. Apple ID到期续费问题及验证手机(开启双重认证)
  16. Telnet 服务 开启 步骤
  17. HTML表单验证pattern
  18. python torch exp_Python torch.diag方法代码示例
  19. Spark on YARN - Clinet模式运行spark报错问题
  20. 霍尔开关在行车记录仪中起速度检测作用

热门文章

  1. Linux下的I/O多路复用select,poll,epoll浅析
  2. 腾讯,字节,阿里,小米,京东大厂Offer拿到手软!分享一点面试小经验
  3. 隐藏导航条HTML,jQuery实现的导航条切换可显示隐藏
  4. go build编译不同环境
  5. scrapy框架的理解
  6. CRM公海自动回收规则
  7. django中的admin组件
  8. 期权价格的上限和下限
  9. [LeetCode] #22 Generate Parentheses
  10. delphi中TStringGrid数据的导出