zoukankan      html  css  js  c++  java
  • TCP建立连接的三次握手和TCP连接断开的四次挥手

    1. TCP建立连接的3次握手

     2. TCP断开连接的四次挥手

    【注意】中断连接端可以是Client端,也可以是Server端。

                            图3—Client端主动发起关闭连接请求

    1. 假设Client端主动发起中断连接请求,也就是发送FIN报文

    2. Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。此时Server端进入ClOSE_WAIT状态。

    3当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。

    4.Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以Client端发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

    【问题1】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

    答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可能最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

    为什么是2MSL,主要是为了考虑到如果最后一个ACK丢失,服务端会重新发FIN,客户端等待2MSL,才能接收到服务端重新发送的FIN报文。

    在服务器的日常维护过程中,会经常用到下面的命令:

     netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'   

    它会显示例如下面的信息:

    TIME_WAIT 814
    CLOSE_WAIT 1
    FIN_WAIT1 1
    ESTABLISHED 634
    SYN_RECV 2
    LAST_ACK 1

    常用的三个状态是:ESTABLISHED 表示正在通信,TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭。

  • 相关阅读:
    AudioStreamer电话打进时崩溃
    ios中NSLog输出格式大全
    IOS Framework制作(一)
    UIButton上的文字添加阴影
    Tim Cook向员工发邮件,祝贺大家实现创纪录的季度
    ios 通讯录“写”操作大全
    AVAudioSession的Category
    IOS播放优酷视频
    iOS 设备的网页调试工具Firebug
    iOS中retain和copy的区别
  • 原文地址:https://www.cnblogs.com/whx7762/p/9402495.html
Copyright © 2011-2022 走看看