TCP链接——爱的传声筒

文章转自    http://network.51cto.com/art/201409/452808_all.htm 若有转载,请注明出处
安全



    TCP通讯最重要的特征是:有序(ordering)和可靠(reliable)。有序是经过将文本流分段并编号实现的。可靠是经过ACK回复和重复发送(retransmission)实现的。这一篇文章将引入TCP链接(connection)的概念。服务器


TCP链接网络

    网络层在逻辑上提供了端口的概念。一个IP地址能够有多个端口。一个具体的端口须要IP地址和端口号共同肯定(咱们记为IP:port的形式)。一 个链接为两个IP:port之间创建TCP通讯。(一个经常使用的比喻为:TCP链接就像两我的打电话,  IP为总机号码,port为分机号码)并发

    参与链接的若是是两台电脑,那么两台电脑操做系统的TCP模块负责创建链接。每一个链接有四个参数(两个IP,两个端口),来代表“谁在和谁通话”。 每台电脑都会记录有这四个参数,以肯定是哪个链接。若是这四个参数彻底相同,则为同一链接;若是这四个参数有一个不一样,即为不一样的链接。这意味着,同一 个端口上能够有多个链接。内核中的TCP模块生成链接以后,将链接分配给进程使用。 ide

一个端口上能够有多个链接

一个端口上能够有多个链接spa

    TCP链接是双向(duplex)的。在TCP协议与"流"通讯中,咱们所展现的TCP传输是单向的。双向链接实际上就是创建两个方向的TCP传 输,因此概念上并不复杂。这时,链接的每一方都须要两个滑窗,以分别处理发送的文本流和接收的文本流。因为链接的双向性,咱们也要为两个方向的文本流编 号。这两个文本流的编号相互独立。为文本流分段和编号由发送方来处理,回复ACK则由接收的一方进行。操作系统


TCP片断的头部格式3d

    在深刻TCP链接以前,咱们须要对TCP片断的头部格式有一些了解。咱们知道,TCP片断分为头部和数据。数据部分为TCP真正传输的文本流数据。下面为TCP片断的头部格式:server

来自wikipediahtm

先关注下面几点:

    1. 一个TCP头部须要包含出发端口(source port)和目的地端口(destination  port)。这些与IP头中的两个IP地址共同肯定了链接。

    2. 每一个TCP片断都有序号(sequence number)。这些序号最终将数据部分的文本片断整理成为文本流。

    3. ACK是一位(bit)。只有ACK位设定的时候,回复号(Acknowledgement  number)才有效。ACK回复号说明了接收方期待接收的下一个片断,因此ACK回复号为最后接收到的片断序号加1。

不少时候,ACK回复“附着”在发送的数据片断中。TCP协议是双向的。好比A和B两个电脑。ACK回复是接收方回复给发送方 (好比A发送给B,   B回复A)。但同时,B也能够是发送方,B有可能有数据发送给A,因此B就把ACK回复附着在它要发送给A的数据片断的头部。这样能够减小ACK所占用的 交通流量。一个片断能够只包含ACK回复。一个纯粹的ACK回复片断不传送文本流,因此不消耗序列号。若是有下一个正常的数据片断,它的序号将与纯粹 ACK回复片断的序号相同。

(ACK回复还能够“附着”在SYN片断和FIN片断)

    4. ACK后面还有SYN和FIN,它们也各占据一位(bit)。我将在后面说明这两位。


链接的创建

    在TCP协议与"流"通讯中讨论的TCP传输须要一个前提:TCP链接已经创建。然而,TCP链接从无到有须要一个创建链接的过程。创建链接的最重 要目是让链接的双方交换初始序号(ISN,  Initial Sequence   Number)。根据TCP协议的规定,文本流的第一个片断的序号不能是肯定的数字(好比说1)。链接的双方各自随机生成本身的ISN,而后再利用的必定 方式让对方了解。这样的规定是出于TCP链接安全考虑:若是以一个肯定的数字做为初始的TCP序号,那么其余人很容易猜出接下来的序列号,并按照正确的序 号发送“假装”的TCP片断,以插入到文本流中。

ISN交换是经过SYN片断实现的。SYN片断由头部的SYN位代表,它的序号为发送方的ISN。该片断由链接的一方首先发给给另外一方,咱们将发送 SYN的一方称为客户(client),而接收SYN的一方称为服务器(server)。咱们使用ISN(c)表示client一方的ISN,使用 ISN(s)表示server一方的ISN。随后,接收到SYN的server须要回复ACK,并发送出包含有server的ISN的SYN片断。下图为 创建链接的过程,也就是经典的TCP三次握手(three-way   handshaking)。两条竖直线分别为client和server的时间轴。每一个箭头表明了一次TCP片断的单向传输。

青色为纯粹的ACK片断。整个过程的本质是双方互发含有本身的ISN的SYN片断。根据TCP传输的规则,接收到ISN的一方须要回复ACK,因此 共计四片信息在创建链接过程当中传输。之因此是三次握手   (而不是四次),是由于server将发送SYN和回复ACK合并到一个TCP片断中。咱们以client方为例。client知道本身的ISN(也就是 ISN(c))。创建链接以后,它也知道了对方的ISN(s)。此后,若是须要发送文本流片断,则编号为ISN(c)  + 1, ISN(c) + 2 ...。若是接收文本流片断,则期待接收ISN(s) + 1, ISN(s) + 2 ...。

链接创建以后,链接的双方就能够按照TCP传输的方式相互发送文本流了。


链接的正常终结

    一个链接创建以后,链接两端的进程能够利用该链接进行通讯。当链接的一方以为“我讲完了”,它能够终结链接中发送到对方方向的通讯。链接最终经过四次握手(four-way  handshaking)的方式终结,链接终结使用的是特殊片断FIN(FIN位为1的片断)。

咱们能够看到,链接终结的过程当中,链接双方也交换了四片信息(两个FIN和两个ACK)。在终结链接的过程当中,TCP并无合并FIN与ACK片 段。缘由是TCP链接容许单向关闭(half-close)。也就是说,TCP链接关闭了一个方向的传输,成为一个单向链接(half-duplex)。 第二个箭头和第三个箭头传递必须分开,才能有空隙在开放的方向上继续传输。若是第二个箭头和第三个箭头合并在一块儿,那么,随着一方关闭,另外一方也要被迫关 闭。

第二和第三次握手之间,server能够继续单向的发送片断给client,但client不能发送数据片断给server。

(上面的终结从client先发起,TCP链接终结也能够从server先发起。)

在Client发送出最后的ACK回复,但该ACK可能丢失。Server若是没有收到ACK,将不断重复发送FIN片断。因此Client不能立 即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK以后进入到TIME_WAIT状态。Client会设置一个计时器,等待 2MSL的时间。若是在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum   Segment   Lifetime)。MSL指一个片断在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。若是直到2MSL,Client都没有再 次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP链接。

TIME_WAIT State

总结

TCP是链接导向的协议,与之对应的是像UDP这样的非链接导向的协议。链接能带来更好的传输控制,但也须要更多额外的工做,好比链接的创建和终结。

咱们还初步了解了TCP的头部格式。应该注意到,许多时候咱们将ACK片断“附着”在其余片断上。相对于纯粹的ACK片断,咱们这样作节约了ACK 所需的流量。事实上,因为ACK片断所需的ACK位和acknowledge   number区域老是存在于TCP的头部,因此附着ACK片断的成本基本上等于0。

相关文章
相关标签/搜索