zoukankan      html  css  js  c++  java
  • TCP三次握手和四次挥手

    TCP三次握手:

    1) 请求端(通常称为客户)发送一个 S Y N段指明客户打算连接的服务器的端口,以及初始序号( I S N,在这个例子中为1 4 1 5 5 3 1 5 2 1)。这个S Y N段为报文段1
    2) 服务器发回包含服务器的初始序号的 S Y N报文段(报文段2)作为应答。同时,将确认序号设置为客户的I S N1以对客户的S Y N报文段进行确认。一个 S Y N将占用一个序号。
    3) 客户必须将确认序号设置为服务器的 I S N1以对服务器的 S Y N报文段进行确认(报文段3)。

    借用TCP/IP详解中的一副图:

     svr4和bsdi分别是通信双方的主机名。I S N可看作是一个3 2比特的计数器,每 4 ms1(关于这个有不同的解释,有些书认为8ms加1,在此不做细谈),当增加到所能表示的最大值时,重新从0开始计数。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它作错误的解释。  

    在这讨论一下几种连接建立失败的情况:

    1、双方网络不通或SYN报文段丢失或应答报文丢失 

      发送方发送SYN报文,迟迟未接收到应答,会导致超时重传(tcp有重传定时器用来重传未收到应答的报文),重传次数与系统实现有关(大多数伯克利系统将建立一个新连接的最长时间限制为 7 5)。

    2、第三次握手ACK报文丢失   

      Server 端会更改TCP连接的状态为SYN_RECV,并在等待超时后再次发送SYN+ACK报文,直到最终超时

    TCP状态变迁图:

     两个导致进入E S TA B L I S H -E D状态的变迁对应打开一个连接,而两个导致从E S TA B L I S H E D状态离开的变迁对应关闭一个连接。 E S TA B L I S H E D状态是连接双方能够进行双向数据传递的状态。
    找个服务器查看一下当前网络中的连接所对应的状态:

     LISTEN表示正常监听,ESTABLISHED表示双方已经已完成握手成功建立连接,SYN_RECV表示server未接收到应答ACK报文,一直处于SYN_RECV状态,待最终超时后关闭连接。

    四次挥手各个状态所对应的节点:

    因为TCP是全双工通信,可以同时向对方发送数据,所以需要在关闭连接的时候,双方都要关闭与对方的连接。

    1.主动关闭方(client)发送FIN报文并进入FIN_WAIT_1状态,被动关闭方(server)应答,返回ack报文,client收到ack报文进入FIN_WAIT_2状态,至此,client至server的单方向连接已经完成关闭。

    2.server端完成数据传送后(假设存在),发送FIN报文请求关闭连接,client收到后应答ack报文,待server收到后,连接完成关闭、

    建立一个连接需要三次握手,而终止一个连接要经过 4次握手。这由 T C P的半关闭( h a l f -c l o s e)造成的。既然一个 T C P连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个 F I N来终止这个方向连接。当一端收到一个 F I N,它必须通知应用层另一端几经终止了那个方向的数据传送。发送F I N通常是应用层进行关闭的结果。
    收到一个F I N只意味着在这一方向上没有数据流动。一个 T C P连接在收到一个 F I N后仍能发送数据。而这对利用半关闭的应用来说是可能的,尽管在实际应用中只有很少的 T C P应用程序这样做。
    首先进行关闭的一方(即发送第一个 F I N)将执行主动关闭,而另一方(收到这个 F I N)执行被动关闭。通常一方完成主动关闭而另一方完成被动关闭(双方可以都执行主动关闭)

    只有当S Y N _ R C V D状态是从 L I S T E N状态(正常情况)进入,而不是从 S Y N _ S E N T状态(同时打开)进入时,从 S Y N _ R C V D回到L I S T E N的状态变迁才是有效的。这意味着如果我们执行被动关闭(进入 L I S T E N),收到一个S Y N,发送一个带A C KS Y N(进入S Y N _ R C V D),然后收到一个R S T,而不是一个A C K,便又回到L I S T E N状态并等待另一个连接请求的到来。
    TCP的ack验证、
    重传定时器基本保证了通信双方发送和接收的报文的完整性,从而使tcp成为理论上的可靠连接。 

     

  • 相关阅读:
    【LeetCode】589.N叉树的前序遍历(递归+迭代,java实现,详细分析)
    百度网盘偷偷更新,终于实现免费不限速了!
    如何调整DOS窗口的宽高
    输入adb shell 时 提示error: more than one device and emulator
    logcat不显示信息
    安卓打开File Explorer里面不显示内容
    android查看源码的时候看不了
    This version of the rendering library is more recent than your version of ADT plug-in. Please update
    eclipse或者AS链接手机真机之后,logcat里面日志信息乱跳
    Android ADB使用之详细篇
  • 原文地址:https://www.cnblogs.com/klxs1996/p/12601986.html
Copyright © 2011-2022 走看看