介绍TCP为应用层提供的服务,以及TCP首部中的各个字段。网络
TCP数据被封装在一个IP数据报中,如图:指针
TCP首部的数据格式,若是不计选项字段,它一般是20个字节:blog
(1)16位源端口号和16位目的端口号:每一个TCP段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址惟一肯定一个TCP链接。进程
(2)32位序号:用来标示从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的第一个数据字节,TCP用序号对每一个字节进行计数。序号是32位无符号数,序号到达2^32-1后又从0开始。当创建一个新的链接时,SYN标示变为1,序号字段包含由这个主机选择的该链接的初始序号ISN(Initial Sequence Number)。该主机要发送数据的第一个字节序号为这个ISN加1,由于SYN标志消耗了一个序号。TCP为应用层提供全双工服务,这意味数据能在两个方向上独立地进行传输,所以,链接的每一端必须保持每一个方向上的传输数据序号。同步
(3)32位确认序号:既然每一个传输的字节都被计数,确认序号包含发送确认的一端所指望收到的下一个序号。所以,确认序号应当是上次已成功收到数据字节序号加1。只有ACK=1时确认序号字段才有效。TCP首部中的确认序号标示发方已成功收到字节,但还不包括确认序号所指的字节。当前还没法对数据流中选定的部分进行确认。例如,若是1~1024字节已经成功收到,下一报文段中包含序号从2049~3072的字节,收端并不能确认这个新的报文段。它所能作的就是发回一个确认序号为1025的ACK,它也没法对一个报文段进行否定。例如,若是收到包含1025~2048字节的报文段,但它的校验和错误,TCP接收端所能作的就是发回一个确认序号为1025的ACK。it
(4)4位首部长度:首部长度给出首部中32bit(4字节)的数目。须要这个值是由于选项字段长度是可变的,这个字段占4位,所以,TCP最多有(1111)=15*4=60字节的首部,然而,没有选项字段,正常的长度是20字节。im
(5)保留(6位):时间戳
(6)URG:紧急指针有效d3
(7)ACK:发送ACK无需任何代价,由于32位的确认序号字段和ACK标志同样,老是TCP首部的一部分。所以,咱们看到一旦一个链接创建起来,这个字段老是被设置,ACK标志也老是被设置为1。通信
(8)PSH:接收方应该尽快将这个报文段交给应用层
(9)RST:重建链接
(10)SYN:同步序号用来发起一个链接
(11)FIN:发端完成发送任务
(12)16位窗口大小:TCP的流量控制由链接的每一端经过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接受端正指望接收的字节。窗口大小是一个16位字段,所以窗口大小最大为65535字节。
(13)16位校验和:校验和覆盖整个TCP报文段:TCP首部和TCP数据,这个一个强制性的字段,必定是由发端计算和存储,并由收端进行校验。
(14)16位紧急指针:只有URG=1时紧急指针才有效,紧急指针是一个正的偏移量,和序号字段中的值相加标示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另外一端发送紧急数据的一种方式。
(15)选项:最多见的可选字段是最大报文长度MSS(Maximum Segment Size),每一个链接方一般都在通讯的第一个报文段中指明这个选项。
(16)数据:TCP实际报文。TCP报文段中的数据部分是可选的。在一个链接创建和一个链接终止时,双方交换的报文段仅有TCP首部,若是一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据,在处理超时的许多状况下,也会发送不带任何数据报文段。
TCP首部能够包含选项部分,最初TCP规范中定义的选项是:(1)选项表结束(2)无操做(3)最大报文段长度
几乎每一个SYN报文段中都遇到过MSS选项。
最新的TCP规范中定义了新的TCP选项:(1)选项表结束(2)无操做(3)最大报文段长度(4)窗口扩大因子(5)时间戳
如图:
每一个选项的开始是1字节kind字段,说明选项的类型。kind字段是0和1的选项仅占1个字节。
其余选项在kind字节后还有len字节,它说明的长度是指总长度,包括kind字节和len字节。
设置无操做选项的缘由在于容许发送方填充字段为4字节的倍数。
好比:<mss 512, nop, wscale 0, nop, nop, timestamp 146647 0>
MSS选项设置为521,自己占用4字节。后面是NOP,接着是窗口扩大选项。第一个NOP用来将窗口扩大选项填充为4字节的边界。
一样,10字节的时间戳选项放在两个NOP后,占12字节。
在好比实际抓包:
尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP彻底不一样的服务。
TCP提供一种面向链接的、可靠的字节流服务。
面向链接意味着两个使用TCP的应用在彼此交换数据以前必须先创建一个TCP链接。