建立连接协议
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 N加1以对客户的S Y N报文段进行确认。一个 S Y N将占用一个序号。
3) 客户必须将确认序号设置为服务器的 I S N加1以对服务器的 S Y N报文段进行确认(报文段3)。
这三个报文段完成连接的建立。这个过程也称为三次握手(three-way handshake)。
发送第一个SYN的一端将执行主动打开,接受这个SYN并发回下一个SYN的另一端执行被动打开。
连接终止协议
建立一个连接需要三次握手,而终止一个连接要经过 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应用程序这样做。正常关闭过程如图 1 8 - 3所示。我们将在1 8 . 5节中详细介绍半关闭。首先进行关闭的一方(即发送第一个 F I N)将执行主动关闭,而另一方(收到这个 F I N)执行被动关闭。通常一方完成主动关闭而另一方完成被动关闭,但我们将在 1 8 . 9节看到双方如何都执行主动关闭。
最大报文段长度(MSS)
MSS表示TCP传往另一端的最大块数据的长度,当一个连接建立时,连接的双方都要通过各自的MSS,如果一方不接受来自另一方的MSS值,则MSS就定为默认值536节;
一般来说,如果分段没有发生,MSS还是越大越好,报文段越大允许每个报文段传送的数据就越多,相对IP和TCP首部有更高的网络利用率。
TCP的半关闭:
T C P提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。
TCP的状态变迁图
2MSL等待状态
T I M E _ WA I T状态也称为 2 M S L等待状态。每个具体 T C P实现必须选择一个报文段最大生存时间M S L(Maximum Segment Lifetime)。它是任何报文段被丢弃前在网络内的最长时间。我们知道这个时间是有限的,因为 T C P报文段以I P数据报在网络内传输,而 I P数据报则有限制其生存时间的T T L字段。
对一个具体实现所给定的 M S L值,处理的原则是:当 T C P执行一个主动关闭,并发回最后一个 A C K,该连接必须在 T I M E _ WA I T状态停留的时间为 2倍的M S L。这样可让 T C P再次发送最后的A C K以防这个A C K丢失(另一端超时并重发最后的 F I N)。
这种2 M S L等待的另一个结果是这个 T C P连接在 2 M S L等待期间,定义这个连接的插口(客户的 I P地址和端口号,服务器的 I P地址和端口号)不能再被使用。这个连接只能在 2 M S L结束后才能再被使用;
在连接处于2MSL等待时,任何迟到的报文段将被丢弃,且如果我们终止一个客户程序,并立即重新启动这个客户程序,则这个客户程序将不能重用相同的本地端口,
平静时间:T C P在重启动后的M S L秒内不能建立任何连接:
复位报文段
无论何时一个报文段发往基准的连接(referenced connection)出现错误, T C P都会发出一个复位报文段;
到不存在的端口的连接请求:
产生复位的一种常见情况是当连接请求到达时,目的端口没有进程正在听。对于 U D P,当一个数据报到达目的端口时,该端口没在使用,它将产生一个I C M P端口不可达的信息。而 T C P则使用复位。
异常终止一个连接:
终止一个连接的正常方式是一方发送 F I N。有时这也称为有序释放(orderly release),因为在所有排队数据都已发送之后才发送 F I N,正常情况下没有任何数据丢失。但也有可能发送一个复位报文段而不是 F I N来中途释放一个连接。有时称这为异常释放;
R S T报文段不会导致另一端产生任何响应,另一端根本不进行确认。收到R S T的一方将终止该连接,并通知应用层连接复位;
检测半打开连接:
如果一方已经关闭或异常终止连接而另一方却还不知道,我们将这样的 T C P连接称为半打开(H a l f - O p e n)的。
同时打开
两个应用程序同时彼此执行主动打开的情况是可能的,尽管发生的可能性极小。每一方必须发送一个 S Y N,且这些S Y N必须传递给对方。这需要每一方使用一个对方熟知的端口作为本地端口。这又称为同时打开(simultaneous open)。
T C P是特意设计为了可以处理同时打开,对于同时打开它仅建立一条连接而不是两条连接(其他的协议族,最突出的是 O S I运输层,在这种情况下将建立两条连接而不是一条连接)。
一个同时打开的连接需要交换 4个报文段,比正常的三次握手多一个。
同时关闭
同时关闭与正常关闭使用的段交换数目相同。
TCP选项
TCP服务器的设计
大多数 的TCP服务器进程是并发的。当一个新的连接请求达到服务器时,服务器接受这个请求,并调用一个新进程来处理这个新的客户请求。
TCP服务器端口号
当传入的连接请求到达并被接收时,系统内核中的 T C P模块就创建一个处于E S TA B L I S H E D状态的进程。
T C P使用由本地地址和远端地址组成的 4元组:目的 I P地址、目的端口号、源 I P地址和源端口号来处理传入的多个连接请求。
呼入连接请求队列
一个并发服务器调用一个新的进程来处理每个客户请求,因此处于被动连接请求的服务器应该始终准备处理下一个呼入的连接请求。有可能出现当服务器在创建一个新的进程时,或操作系统正忙于处理优先级更高的进程时,到达多个连接请求。当服务器正处于忙时, T C P是如何处理这些呼入的连接请求?
TCP实现中采用以下原则:
1)正等待连接请求的一端有一个固定长度的连接队列,该队列中的连接已被 T C P接受(即三次握手已经完成),但还没有被应用层所接受。注意区分 T C P接受一个连接是将其放入这个队列,而应用层接受连接是将其从该队列中移出。
2)应用层将指明该队列的最大长度,这个值通常称为积压值;
3)当一个连接请求(即S Y N)到达时, T C P使用一个算法,根据当前连接队列中的连接数来确定是否接收这个连接。
4)如果对于新的连接请求,该 T C P监听的端点的连接队列中还有空间(基于图 1 8 - 2 3),T C P模块将对 S Y N进行确认并完成连接的建立。但应用层只有在三次握手中的第三个报文段收到后才会知道这个新连接时。
5)如果对于新的连接请求,连接队列中已没有空间, T C P将不理会收到的 S Y N。也不发回任何报文段(即不发回 R S T)。如果应用层不能及时接受已被 T C P接受的连接,这些连接可能占满整个连接队列,客户的主动打开最终将超时;