linux网络编程:TCP编程下篇

通过中篇我们学习TCP通过三次握手建立连接。
那么本篇我们先来说说关闭连接。

1.四次挥手原理:
服务器 客户端
<<—(FIN seq=i)----<<—close()
->>------(ACK=i+1)---------->>
->>----(FIN seq=j)----------->>
-<<-----(ACK=j+1)-----<<-------

描述一下就是:
客户端close(),发送一个含有序号的FIN报文给服务器
服务器收到后,回复一个确认收到信息ACK:给收到的序号+1
当服务器要关闭时,也发送一个含有序号的FIN报文给客户端
客户端收到后,回复一个确认信息ACK:给收到的序号加1

此时我们发现在某些条件下是可以只发生三次挥手的:
当收到客户端的关闭连接信息后,服务器本身没有其他的操作要做也要关闭连接时,就可直接将确认信息ACK与要发送给客户端的关闭信息FIN一同发送,就会产生特殊的三次挥手。

2.说完了三次握手与四次挥手之后,我们来分析服务器客户端通信的状态转移图。
1.连接阶段

  1. 开始都处于CLOSED状态
  2. 然后服务器被动打开 处于listen状态
  3. 客户端主动发送SYN 处于SYN_SENT状态
  4. 服务器收到SYN 发送SYN+ACK 后处于SYN_RCVD状态
  5. 客户端收到SYN和ACK 发送ACK后 就处于ESTABLISHED状态
  6. 服务器收到ACK 也就处于ESTABLISHED状态了
  7. 此时代表三次握手完成 连接成功

2.关闭阶段

  1. 初始都为于ESTABLISHED状态
  2. 当客户端主动关闭发送FIN给服务器后,客户端就变成FIN_WAIT1状态
  3. 服务器收到FIN 发送一个ACK后,就变成CLOSE_WAIT状态
  4. 客户端收到ACK后,就变成FIN_WAIT2状态
  5. 服务器发送FIN后,就处于LAST_ACK状态
  6. 客户端收到FIN,并发送一个ACK后变成TIME_WAIT状态,等待2msl,即2个最大报文的生存时间。
  7. 服务器收到ACK后关闭成功,消失

TIME_WAIT状态是什么?为什么会有这样的一个状态,它的作用是什么?

  1. 可靠的终止TCP连接
  2. 保证让迟来的TCP报文段有足够的时间被识别并丢弃。
    解释:
    1.当客户端最后一次发送ACK给服务器时,这个ACK报文可能会丢失,而服务器一直没有收到客户端的ACK报文,就以为自己发送的的FIN丢失了,服务器就会超时重传再次发送FIN,而客户端就会再次发送ACK报文。
    而如果没有这个TIME_WAIT的2msl,客户端发完ACK就关闭的话,就接受不到服务器超时重传的FIN,就意味着客户端收到一个非法的报文段,客户端就返回一个RST数据报,表明拒绝此次通信,然后客户端与服务器就会都产生异常。
    2这个TIME_WAIT的2msl时间内,足够让本次连接中所有的报文段都从网络中消失,这样下一次新的连接中就不会出现上一次连接的数据了。而如果没有这个TIME_WAIT的2msl,本次连接刚结束,下一次连接马上开始,那么新的连接中可能会出现上一次连接迷失在网络中的SYN报文,当不同的SYN同时或者不同时间到达时,所以就会出现问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值