学习TCP/IP - TCP三次握手连接和四次握手断开连接

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

    

 

  

猜你喜欢

转载自www.cnblogs.com/timfruit/p/10350654.html