zoukankan      html  css  js  c++  java
  • 学习TCP/IP

    TCP连接

    一、为什么需要TCP

      链路层将位流封装成数据帧,同时屏蔽了底层物理层的复杂性; 网络层定义了IP地址,划分了网段,使得源计算机可以快速找到目标计算机,但它无法保证数据准确到达. 所以在传输层定义了TCP协议,它是面向连接的可靠传输协议,

     

    、TCP如何建立连接

       2.1) TCP三次握手建立连接

      

      TCP三次握手创建连接

        a. 由于TCP是面向连接的,所以有服务端和客户端之分。服务端先在对应的端口监听(LISTENING), 等待客户端发送的tcp连接请求。

        b. A机器向B机器发起TCP连接的请求(SYN=1), 假设序列号seq=x, 此时A机器进入SYNC_SENT状态。

          c. B机器收到请求后,对A机器的TCP请求进行确认(SYN=1,ACK=1,ack=x+1), 该数据序列号假设为y, 此时B机器进入SYNC_RCVD。

        d. A机器对B机器的确认进行确认回复(ACK=1, ack=y+1), 该数据序列号为x+1。此时A机器进入ESTABLISHED状态。

        e. B机器收到之后,也进入ESTABLISHED状态, 此时两个机器已经建立了TCP连接,可以进行双向数据传输。

      2.2) 为什么需要三次握手,而不是两次

      (1) 确保双方信息对等

      

     

      (2) 防止因请求超时导致脏链接

        a. 第一次超时, 请求包仍在网络上传输

        b. A重复请求, B收到后建立连接,然后向A确认,A收到后,确认建立连接

        c. 双方交流完毕后,断开链接.

        d. 此时,B收到第一次超时的请求包,B会建立链接, A仍认为没有连接. 这时,就出现了脏连接

      

      两次握手建立连接会产生脏连接

      

    三、TCP如何断开连接

       3.1) 四次握手断开连接

      

      TCP四次握手断开连接

          a. A发送完己方数据后(FIN=1), 主动请求关闭连接, 假设序列号seq=u,  此时A进入FIN_WAIT_1

        b. B收到请求后,需要向A回复确认(ACK=1, ack=u+1), 假设序列号seq=v, 此时B进入CLOSE_WAIT,

          为什么不立即关闭呢?因为是全双工通信, B的数据有可能尚未发送完毕

        c.  A收到确认之后进入FIN_WAIT_2

          d. B发送完数据之后(FIN=1), 向A发出信号, 假设数据序列号seq=w, (因为B会发送不定量的数据,所以序列号不确定),

          此时B进入LAST_ACK, 等待A的最后确认

        e. A收到B发完数据的消息后, 向B回复确认(ACK=1, ack=w+1),序列号seq=u+1, 此时A进入TIME_WAIT状态, 将会等待2MSL时间

           (RFC793规定MSL为2分钟, 实际会更小, 因为当前网络设施比较好)

        f. B收到之后, 即进入关闭状态CLOSED

        g. A等待了2MSL时间后, 没有收到B的任何数据,即进入关闭状态CLOSED

     

      3.2) 为什么要在TIME_WAIT等待2MSL时间?

       MSL是报文在网络上生存的最大时间,超过阀值便将报文丢弃。一般来说,MSL大于TTL衰减至0的时间。在TIME_WAIT等待2MSL有以下2个原因:

           (1) 确认被动关闭方能够顺利进入CLOSED状态

      如果A发出第4次握手的数据之后,直接进入CLOSED状态,当B没有收到第4次握手的数据时,会一直重发第3次握手的数据,由于A已经CLOSED,B不会停止重发数据。

           (2) 防止失效请求,确保本次连接中传输的数据消亡,避免失效连接的数据与正常连接的数据混淆

     

     

     

    学习资料

      《码出高效 Java开发手册》 1.5.3 ,  1.5.4

        

     

      

    人生没有彩排,每一天都是现场直播
  • 相关阅读:
    GAIN: Gradient Augmented Inpainting Network for Irregular Holes
    Python+Selenium实现对浏览器的自动操作
    python 中的内置类属性__name__和__doc__
    Python 装饰器
    Free-Form Image Inpainting with Gated Convolution
    解决ubuntu安装软件has install-snap change in progress错误
    Image Inpainting for Irregular Holes Using Partial Convolutions
    理解卷积
    Hive中分区表修复问题
    B2B、B2C、C2C、O2O分别是什么意思?
  • 原文地址:https://www.cnblogs.com/timfruit/p/10350654.html
Copyright © 2011-2022 走看看