TCP服务

TCP服务

    在TCP/IP协议的认识一文中,我们知道TCP服务是属于传输层的。TCP提供了一种面向连接,提供可靠的,字节流传输服务。采用三次握手建立一个连接,采用4次挥手来关闭一个连接。

    那么什么是面向连接,是不是还有面向无连接的传输服务?我们来简单了解一下

    传输方式的分类

    通过网络发送数据,大致可以分为面向有连接与面向无连接两种类型。

    1、面向有连接型

    面向有连接中,在发送数据之前,需要在收发主机之间连接一条通信线路。

    举例:比如人们平常打电话,输入对方电话拨出之后,只有对方拿起电话才能真正通话,通话结束挂掉电话就如同切断电源。

    优点:这样可以避免发送无谓的数据。

    2) 面向无连接型

    面向无连接则不要求建立和断开连接。发送端可于任何时候自由发送数据。反之,接收端也永远不知道自己会在何时从哪里收到数据。因此,在面向无连接的情况下,接收端需要时常确认是否收到了数据。

    举例:比如在邮局寄包裹,负责处理邮递业务的营业员,不需要确认收件人的详细地址是否存在,也不需要确认收件人是否能收到包裹,只要发件人有一个寄件地址就可以办理邮寄业务。

    优点:这种方式可以省略某些既定的、繁杂的手续,使处理变得简单,易于制作一些低成本的产品,减轻处理负担。

    TCP服务模型

    这里,借用一下网络上别人的图,链接在下方贴出,来说明三次握手和四次挥手的过程以及状态变迁,如下图:

 

    TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的。

    我们来理解一下上图的含义:

    一、 三次握手:

        TCP三次握手过程和状态变迁:

        最开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态。

       1) 客户端主动向服务器发送 SYN报文 ,之后,状态更改为SYN-SENT

       2) 服务器端收到 SYN报文 后,向客户端发送SYN+ACK,之后,状态更改为SYN-RCVD

       3) 客户端收到服务端发来的数据包后,向服务器端发送ACK,之后,客户端状态更改为 ESTABLISHED。服务端接收到客户端的响应数据包,状态也更改为ESTABLISHED。

       如何理解三次握手的作用

       1)换个易于理解的角度来看为什么要3次握手?

       客户端和服务端通信前要进行连接,“3次握手”的作用就是双方都能明确自己和对方的收、发能力是正常的。每次都是接收到数据包的一方可以得到一些结论,发送的一方其实没有任何头绪。

       2)三次握手的目的并不只是让通信双方都了解到一个连接正在建立,还在于利用数据包的选项来传输特殊的信息交换初始序列号ISN(Initial Sequence Number)

       那么客户端和服务端之间是如何交换(协商)序列号呢?我们通过下面的图了解一下:

       

       再来分下客户端和服务器端交换序列号的过程:

       1)客户端发送一个SYN段,并指明客户端的初始序列号,即ISN(c)。

       2)服务端发送自己的SYN段作为应答,同样指明自己的ISN(s)。为了确认客户端的SYN,将ISN(c)+1作为ACK数值。这样,每发送一个SYN,序列号就会加1。如果有丢失的情况,则会重传。

       3)为了确认服务器端的SYN,客户端将ISN(s)+1作为返回的ACK数值。

       接下来以三个方面分析三次握手的原因:

  •        三次握手才可以阻止重复历史连接的初始化(主要原因)
  •        三次握手才可以同步双方的初始序列号
  •        三次握手才可以避免资源浪费

     下面用一张图来解释:

      

     二、四次挥手

       天下没有不散的宴席,对于 TCP 连接也是这样, TCP 断开连接是通过四次挥手方式。

       1、TCP四次挥手过程和状态变迁

        1) 客户端向服务器发送 FIN , 之后客户端状态更改为FIN-WAIT-1

        2) 服务器端收到数据包后,还可以向客户端继续发送数据 DATA,发送之后,再发出 ACK ,之后服务器端状态更改为 CLOSE_WAIT

        3) 客户端收到服务器端发送的数据包,将状态更改为FIN-WAIT-2,不做回应。服务器端接着向客户端发送 FIN ,之后,服务器端状态更改为LAST-ACK

        4) 客户端收到服务器端的数据包后,向服务器端发送 ACK, 发送完后A进入TIME-WAIT时间等待状态,之后等待2MSL后,期间若未收到服务端的FIN+ACK报文,客户端的状态就会初始化为CLOSED。服务器端收到客户端发来的数据包后,将状态更为CLOSED,断开与该客户端连接,然后会迅速进入LISTEN收听状态,继续接受下一个客户端的请求连接。

        2、为什么挥手需要四次

         再来回顾下四次挥手双方发 FIN 包的过程,就能理解为什么需要四次了。

        1)关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
        2)服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。
        从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般都会分开发送,从而比三次握手导致多了一次。

        说明: 

        1)3次握手是指发送了3个报文段,4次挥手是指发送了4个报文段。

        2)SYN 和 FIN 段都是会利用重传进行可靠传输的。

        3、四次挥手释放连接时,等待2MSL的意义?
        MSL是Maximum Segment Lifetime的英文缩写,可译为“最长报文段寿命”,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。在 Linux 系统中,MSL 被定义成 30 秒, 2MSL 就是 60 秒。

        两个理由:

       1)保证客户端发送的最后一个ACK报文段能够到达服务端。

       这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,服务端超时重传FIN+ACK报文段,而客户端能在2MSL时间内收到这个重传的FIN+ACK报文段,接着客户端重传一次确认,重新启动2MSL计时器,最后客户端和服务端都进入到CLOSED状态,若客户端在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到服务端重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则服务端无法正常进入到CLOSED状态。

       2)防止“已失效的连接请求报文段”出现在本连接中

       客户端在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段

       4、为什么TIME_WAIT状态需要经过2MSL才能返回到CLOSED状态?

       理论上,四个报文都发送完毕,就可以直接进入CLOSED状态了,但是可能网络是不可靠的,有可能最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

      三、 数据传输

      要解决的问题:吞吐量、丢包、粘包、错误、超时重传,序号

      1、ISN

       三次握手的一个重要功能是客户端和服务端交换ISN(Initial Sequence Number), 以便让对方知道接下来接收数据的时候如何按序列号组装数据

       如果ISN是固定的,攻击者很容易猜出后续的确认号。因此ISN是根据一定的算法生成的随机序列号

       生成的算法:

       ISN = M + F(localhost, localport, remotehost, remoteport)
       M是一个计时器,每隔4毫秒加1。 F是一个Hash算法,根据源IP、目的IP、源端口、目的端口生成一个随机数值。要保证hash算法不能被外部轻易推算得出

      2、使滑动窗口实现

      1)如果一次只发送一个包,等待对方ack, 之后再发送一个包。。。这样会带来吞吐量低的问题。

      2)滑动窗口的容量是固定的,一次可以发送多个包。并且给这些数据包按照序号标记上状态:已发送未ack,未发送未ack。比如4,5,6,7其中5,6,7已经ack,它会等待4被ack后,将4,5,6,7一起返回。

      个人理解

      每次是由客户端先主动发送网络数据包,服务器属于被动回应,这样设计是为了:

      1.  避免建立无效连接,占用带宽

      2.  客户端跟服务器:一般都是多对一,或者说客户端比服务器要多,从节省资源上考虑

 

参考链接:

https://zhuanlan.zhihu.com/p/53374516

https://www.cnblogs.com/xiaolincoding/p/12638546.html

原文地址:https://www.cnblogs.com/hld123/p/14591072.html