TCP 传输控制协议( 二 )


每个用于传送TCP的通道都有一个端口标记,因为这个标记是由每个TCP终端确定的,因
此TCP可能不唯一,为了保证这个数值的唯一,要使用网络地址和端口号的组合达到唯一
标识的目的,我们称这个为了套接字(Socket),一个连接由连接两端的套接字标识,
本地的套接字可能和不同的外部套接字通信,这种通信是全双工的 。
通过向本地端口发送OPEN命令及外部套接字参数建立连接,TCP返回一个标记这个连接的
名称,以后假如用户需要使用这个名称标记这个连接 。为了保存这个连接的信息,我们
假设有一个称为传输控制块(Transmission Control Block,TCB)的东西来保存 。OPE
N命令还指定这个连接的建立是主动请求还是被动等待请求 。下面我们要涉及具体的功能
了,TCP段以internet数据报的形式传送 。IP包头传送不同的信息域,包括源地址和目的
地址 。TCP头跟在internet包头后面,提供了一些专用于TCP协议的信息 。下图是TCP包头
格式图:
源端口:16位;
目的端口:16位
序列码:32位,当SYN出现,序列码实际上是初始序列码(ISN),而第一个数据字节是
ISN 1;
确认码:32位,假如设置了ACK控制位,这个值表示一个预备接收的包的序列码;
数据偏移量:4位,指示何处数据开始;
保留:6位,这些位必须是0;
控制位:6位;
窗口:16位;
校验位:16位;
优先指针:16位,指向后面是优先数据的字节;
选项:长度不定;但长度必须以字节记;选项的具体内容我们结合具体命令来看;
填充:不定长,填充的内容必须为0,它是为了保证包头的结合和数据的开始处偏移量能
够被32整除;
 
我们前面已经说过有一个TCB的东西了,TCB里有存储了包括发送方,接收方的套接字,
用户的发送和接收的缓冲区指针等变量 。除了这些还有一些变量和发送接收序列号有关

发送序列变量
SND.UNA - 发送未确认
SND.NXT - 发送下一个
SND.WND - 发送窗口
SND.UP - 发送优先指针
SND.WL1 - 用于最后窗口更新的段序列号
SND.WL2 - 用于最后窗口更新的段确认号
ISS - 初始发送序列号
 
接收序列号
RCV.NXT - 接收下一个
RCV.WND - 接收下一个
RCV.UP - 接收优先指针
IRS - 初始接收序列号
下图会帮助您了解发送序列变量间的关系:
当前段变量
SEG.SEQ - 段序列号
SEG.ACK - 段确认标记
SEG.LEN - 段长
SEG.WND - 段窗口
SEG.UP - 段紧急指针
SEG.PRC - 段优先级
连接进程是通过一系列状态表示的,这些状态有:LISTEN,SYN-SENT,SYN-RECEIVED,
ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAI
T和 CLOSED 。CLOSED表示没有连接,各个状态的意义如下:
LISTEN - 侦听来自远方TCP端口的连接请求;
SYN-SENT - 在发送连接请求后等待匹配的连接请求;
SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;
ESTABLISHED - 代表一个打开的连接,数据可以传送给用户;
FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
FIN-WAIT-2 - 从远程TCP等待连接中断请求;
CLOSE-WAIT - 等待从本地用户发来的连接中断请求;
CLOSING - 等待远程TCP对连接中断的确认;
LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认;
TIME-WAIT - 等待足够的时间以确保远程TCP接收到连接中断请求的确认;
CLOSED - 没有任何连接状态;

推荐阅读