zoukankan      html  css  js  c++  java
  • [TCP/IP] TCP建立与终止

    TCP的建立与终止

    三次握手与四次挥手  

      TCP提供一种可靠面向连接字节流传输层的服务。TCP是一种面向连接的单播协议
      一个TCP连接由一个4元组构成,它们分别是源IP地址和源端口号,目的IP地址和目的端口号。更准确的说,一个TCP连接是由一对端点或套接字构成,其中通信的每一端都由一对(IP地址,端口号)所唯一标识。
      一个TCP连接通常分为3个阶段:启动、数据传输和退出。
      为了建立一个TCP连接,需要完成以下步骤:
      1.客户端发送一个SYN报文段,并指明自己想要连接的端口号和它的客户端初始序列号(记为ISN(c))。通常客户端还会借此发送1个或多个选项。客户端发送的这个SYN报文段称作段1。
      2.服务器也发送自己的SYN报文段作为响应,并包含了它的初始序列号(记为ISN(s)),该段称为段2。此外,为了确认客户端的SYN,服务器将包含的ISN(c)数值加1后作为返回的ACK数值。因此,每发送一个SYN,序列号都会自动加1。这样如果出现丢失的情况,该SYN段将会重传。
      3.为了确认服务器的SYN,客户端将ISN(s)的值加1后作为返回的ACK数值。这称为段3。
      通过发送上述3个报文段就能够完成一个TCP连接的建立。它们也常称作三次握手
      三次握手的目的不仅在于让通信双方了解一个连接正在建立,还在于利用数据包的选项来承载特殊的信息,交换初始序列号。
      TCP协议规定通过发送一个FIN段来发起关闭操作。只有当连接双方都完成关闭操作后,才构成一个完整关闭:
      1.连接的主动关闭者发送一个FIN段指明接收者希望看到的自己当前序列号(K)。FIN段还包含了一个ACK段用于确认对方最近一个发来的数据(L)。
      2.连接的被动关闭者将K的数值加1作为响应的ACK值,以表面它以及成功接收到主动关闭者发送的FIN。此时,上层的应用程序会被告知连接的另一端已经提出了关闭的请求,通常,这将导致应用程序发起自己的关闭操作。接着,被动关闭者将身份变为主动关闭者,并发送自己的FIN。该报文段的序列号为L。
      3.为了完成连续的关闭,最后发送的报文段还包含一个ACK用于确认上一个FIN。值得注意的是,如果出现FIN丢失的情况,那么发送方将重新传输直到接收到一个ACK确认为止。
      综上所述,建立一个TCP连接需要3个报文段,而关闭一个TCP连接需要4个报文段。

     TCP半关闭

      半关闭,即:应用程序表明“我已经完成了数据的发送工作,并发送一个FIN给对方,但是我仍然希望接收来自对方的数据直到它发送一个FIN给我”。

      首先发送的两个报文段与TCP正常关闭完全相同:初始者发送的FIN,接着是接收者回应该FIN的ACK。接收到半关闭的一方仍能够发送数据,当接收半关闭的一方完成数据发送后,它将会发送一个FIN来关闭本方的连接,同时向发起半关闭的应用程序发出一个文件尾提示。当第二个FIN被确认后,整个连接完全关闭。

    TCP同时打开与关闭

      通信双方在接收到来自对方的SYN之前必须先发送一个SYN;两个SYN必须经过网络送达对方。该场景还要求通信双方都拥有一个IP地址和端口号,并且将其告知对方。

      一个同时打开过程需要交换4个报文段,比普通的三次握手增加了一个。由于通信双方都扮演了客户端与服务器的角色,因此不能够将任何一方称为客户端或服务器。同时关闭并没有太大区别。通信一方(通常是客户端,但不一定总是)提出主动关闭请求,并发送首个FIN。在同时关闭中,通讯双方都会完成上述工作。

      同时关闭需要交换与正常关闭相同数量的报文段。两者真正的区别在于报文段序列是交叉的还是顺序的。

    初始序列号

    当一个连接打开时,任何拥有合适的IP地址、端口号、符合逻辑的序列号以及正确检验和的报文段都将被对方接受。在这种情况下,就需要一个初始序列号来解决TCP报文段在经过网络路由后可能存在延迟抵达与排序混乱的情况。

    在发送SYN之前,通信双方都会选择一个初始序列号。这个初始序列号随时间而变化,因此每个连接都拥有不同的初始序列号。

    连接建立超时

    例如在服务器关闭的情况下,客户端TCP为了建立连接频繁发送SYN报文段。这里存在一个称为指数回退的行为。每个SYN的发送间隔为前一个发送间隔的2倍。

    TCP选项

    最大段大小选项

    最大段大小是指TCP协议所允许的从对方接收到的最大报文段。最大段大小只记录TCP数据的字节数而不包括其他相关的TCP和IP头部。这个最大报文段在SYN中的MSS选项中,默认数值为536字节。

    选择确认项

    TCP采用累计ACK确认,TCP不能正确地确认之前已经接收的数据。由于接收的数据是无序的,所以接收到数据的序列号也是不连续的,这样 TCP接收方的数据队列中就会出现空洞情况。因此在提供字节流传输服务时,TCP接收方需要防止应用程序使用超出空洞的数据。

    TCP“选择确认”提供了当TCP发送方了解接收方当前空洞,可以在报文段丢失或被接收方遗漏时更好的进行重传的工作。当接收到乱序的数据时,它能提供SACK来表述乱序的数据,从而帮助对方有效的重传。SACK消息包含了接收方已经成功接收的数据块的 序列号范围。每个范围称为一个SACK块,由一对32位的序列号表示。虽然只有SYN报文段才能包含“允许选择确认”选项,但是只要发送方已经发送了该选项,SACK块能通过任何报文段发送出去。

     窗口缩放选项

    窗口缩放选项能够有效地将TCP窗口广告字段的范围从16位增加到30位。TCP头部不需要改变窗口广告字段的大小,仍然维持16位的数值。同时,使用另一个选项作为16位数值的比例因子。该比例因子能够使窗口字段有效的左移。

    该选项只能出现于一个SYN报文中,因此当连接建立以后比例因子是与方向绑定的。为了保证窗口调整,通信双方都需要在SYN报文段中包含该选项。

    时间戳选项

    时间戳选项(TSOPT或TSopt)要求发送方在每一个报文段中添加2个4字节的时间戳数值,接收方会再确认中反映这些数值,允许发送方针对每一个接收到的ACK估算TCP连接的发往返时间。当使用时间戳选项时,发送方将一个32位数值填充到时间戳数值字段作为时间戳选项的第一个部分;而接收方则将收到的时间戳原分不动地填充值第二部分的时间戳回显重试字段。

    用户超时选项

    用户超时数值指明了TCP发送者在确认对方未能成功接收数据之前愿意等待该数据ACK确认的时间。

    认证选项

    TCP设置了一个选项用于增强连接的安全性。设置该选项的目的在于增强与替换较早的TCP-MD5机制。它使用一种加密散列算法以及TCP连接双方共同维护的一个秘密值来认证每一个报文段。

  • 相关阅读:
    七牛图片上传JSSDK
    2015年12月中国航空公司名录
    HTML5 开发框架
    利用HTML5定位功能,实现在百度地图上定位
    openerp7 时区问题
    AS3使用Json 传复杂数据 -------- 用数组而不是向量
    随便写写
    生产环境该如何选择lvs的工作模式,和哪一种算法
    获取Linux权限后安装rootkit
    IT求职经验分享
  • 原文地址:https://www.cnblogs.com/immjc/p/7624264.html
Copyright © 2011-2022 走看看