序号用来标识从T C P发端向T C P收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则 T C P用序号对每个字节进行计数。序号是32 bit的无符号数,序号到达 2^32-1后又从0开始。
T C P为应用层提供全双工服务。这意味数据能在两个方向上独立地进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。
T C P提供了一种可靠的面向连接的字节流运输层服务。
T C P将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据; T C P提供端到端的流量控制,并计算和验证一个强制性的端到端检验和。
三次握手
- 请求端(客户)发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号ISN,这个SYN段为报文段1.
- 服务器发回包含服务器的初始序号的SYN报文段(2)作为应答.同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认,一个SYN将占用一个序号.
- 客户必须将确认序号设置为服务器的ISN加1以对服务器的 SYN报文段(3)进行确认
当一端为建立连接而发送它的 S Y N时,它为连接选择一个初始序号。 I S N随时间而变化,因此每个连接都将具有不同的 I S N。 RFC 793 [Postel 1981c]指出I S N可看作是一个3 2比特的计数器,每 4 m s加1。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它作错误的解释。
建立一个连接需要三次握手,而终止一个连接要经过 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后仍能发送数据。
当服务器收到这个 F I N,它发回一个A C K,确认序号为收到的序号加 1(报文段5) 。和S Y N一样,一个F I N将占用一个序号。同时 T C P服务器还向应用程序(即丢弃服务器)传送一个文件结束符。接着这个服务器程序就关闭它的连接,导致它的 T C P端发送一个F I N(报文段6) ,客户必须发回一个确认,并将确认序号设置为收到序号加1(报文段7) 。
最大报文段长度
当建立一个连接时,每一方都有用于通告它期望接收的 M S S选项(M S S选项只能出现在S Y N报文段中) 。如果一方不接收来自另一方的 M S S值,则M S S就定为默认值5 3 6字节(这个默认值允许 2 0字节的I P首部和2 0字节的T C P首部以适合5 7 6字节I P数据报)。
当 T C P发送一个 S Y N时,或者是因为一个本地应用进程想发起一个连接,或者是因为另一端的主机收到了一个连接请求,它能将 M S S值设置为外出接口上的 M T U长度减去固定的I P首部和T C P首部长度。对于一个以太网, M S S值可达1 4 6 0字节。
如果目的 I P地址为“非本地的 ( n o n l o c a l )”, M S S通常的默认值为 5 3 6。
TCP的状态变迁图


2MSL等待状态
T I M E _ WA I T状态也称为 2 M S L等待状态。每个具体 T C P实现必须选择一个报文段最大生存时间M SL(Maximum Segment Lifetime) 。它是任何报文段被丢弃前在网络内的最长时间。
当 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)