Chinaunix首页 | 论坛 | 博客
  • 博客访问: 787397
  • 博文数量: 104
  • 博客积分: 915
  • 博客等级: 下士
  • 技术积分: 2171
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-24 21:34
文章分类

全部博文(104)

文章存档

2018年(4)

2015年(14)

2014年(9)

2013年(56)

2012年(21)

分类: 网络与安全

2013-04-16 10:49:46


四次挥手

        当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求

        主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1
        由B 端再提出反方向的关闭请求,将FIN置1
        主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束




1、 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
      这是因为:服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。
      但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;
      但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

2、 为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
     这是因为:虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到 ESTABLISH状态那样);
     但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于 LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的 ACK报文。


阅读(926) | 评论(0) | 转发(0) |
0

上一篇:数据包的封装过程

下一篇:static变量

给主人留下些什么吧!~~