TCP报头概述
- 格式:doc
- 大小:175.00 KB
- 文档页数:5
TCP连接过程及报⽂解析可能⼤家都听过TCP建⽴连接时需要经历三次握⼿和四次挥⼿的。
那么具体的握⼿挥⼿的过程是怎么样的呢?这篇⽂章就通过WireShark抓包来了解TCP连接建⽴和断开的过程。
实验⽅法:写⼀段简单的代码代码客户端和服务端,分别部署,让客户端主动像服务器发起连接,随后断开。
让WireShark抓股这个过程中产⽣了哪些包,并对其分析。
(注:WireShark默认不⽀持LoopBack,需要将客户端和服务端分开部署,或是配置WireShark)。
⾸先,我们先来看⼀下连接建⽴和断开的过程中,产⽣了哪⼏个包。
从上图我们可以看到,正好是七个包,符合我们三次握⼿四次挥⼿的过程。
分析其过程,WireShark已经为我们解析了每个TCP包的标志位(之后会详细解释,主要⽤来区分每个包的⽤途)。
TCP建⽴连接:1).客户端向服务器发起建⽴连接请求(SYN)2).服务端收到后,像客户端回复⼀个建⽴连接请求的响应(SYN,ACK)3).客户端收到后,继续向服务端发送⼀个响应(ACK)三次握⼿完成,正式建⽴连接。
TCP断开连接1).断开发起⽅向另⼀⽅发送断开连接请求(FIN,ACK)2).另⼀⽅收到后,回复⼀个响应(ACK)3).再由另⼀⽅主动发送⼀个断开连接请求(FIN,ACK)4).断开发起⽅收到后,回复⼀个响应(ACK)四次挥⼿完成,断开SOCKET连接。
我们通过图⽚来加深⼀下印象:了解完过程,再让我们通过分析第⼀个包的内容,初步了解下TCP报⽂结构:我们可以看到整个消息帧是66个字节:1).该帧是⼀个以太⽹消息帧:分为⾸部和数据两个部分。
⾸部前六个字节(30 9c 23 bc 9d 80)表⽰⽬的地MAC地址后六个字节(30 9c 23 1c 0f 74)表⽰源MAC地址我们可以看到当数据在链路层中传输的时候,是由MAC地址标识定位的。
之后两个字节(08 00)表⽰上层协议类型(这⾥的0x 08 00表⽰的就是IP协议)剩余的52(66 - 6 - 6 - 2)个字节为数据部分,来承载上层协议(本例中为IP协议)的消息。
ARP,IP,ICMP,TCP,UDP报⽂头部结构ARP头部结①硬件类型:指明硬件的类型,以太⽹是1。
②协议类型:指明发送者映射到数据链路标识的⽹络层协议的类型;IP对应0x0800。
③硬件地址长度:也就是MAC地址的长度,单位是字节,这⾥是6。
④协议地址长度:⽹络层地址的长度,即IP地址长度,单位是字节,这⾥为4。
⑤操作:指明是ARP请求(1)还是ARP应答(2),======================================================================================================== IP头部结构======================================================================================================= ICMP头部结构====================================================================================================== TCP头部结构端⼝号:常说FTP占21端⼝、HTTP占80端⼝、TELNET占23端⼝等,这⾥指的端⼝就是TCP或UDP的端⼝,端⼝就像通道两端的门⼀样,当两机进⾏通讯时门必须是打开的。
源端⼝和⽬的端⼝各占16位,2的16次⽅等于65536,这就是每台电脑与其它电脑联系所能开的“门”。
⼀般作为服务⼀⽅每项服务的端⼝号是固定的。
本例⽬的端⼝号为00 15,换算成⼗进制为21,这正是FTP的默认端⼝,需要指出的是这是FTP的控制端⼝,数据传送时⽤另⼀端⼝,第三组的分析能看到这⼀点。
客户端与服务器联系时随机开⼀个⼤于1024的端⼝,本例为04 28,换算成⼗进制为1064。
你的电脑中了⽊马也会开⼀个服务端⼝。
数据包报文格式(IP包TCP报头UDP报头)一、IP包格式IP数据包是一种可变长分组,它由首部和数据负载两部分组成。
首部长度一般为20-60字节(Byte),其中后40字节是可选的,长度不固定,前20字节格式为固定。
数据负载部分的长度一般可变,整个IP数据包的最大长度为65535B。
1、版本号(Version)长度为4位(bit),IP v4的值为0100,IP v6的值为0110。
2、首部长度指的是IP包头长度,用4位(bit)表示,十进制值就是[0,15],一个IP包前20个字节是必有的,后40个字节根据情况可能有可能没有。
如果IP包头是20个字节,则该位应是20/4=53、服务类型(Type of Service TOS)长度为8位(bit),其组成:前3位为优先级(Precedence),后4位标志位,最后1位保留未用。
优先级主要用于QoS,表示从0(普通级别)到7(网络控制分组)的优先级。
标志位可分别表示D(Delay更低的时延)、T(Throughput 更高的吞吐量)、R(Reliability更高的可靠性)、C(Cost 更低费用的路由)。
TOS只表示用户的请求,不具有强制性,实际应用中很少用,路由器通常忽略TOS字段。
4、总长度(Total Length)指IP包总长度,用16位(bit)表示,即IP包最大长度可以达216=65535字节。
在以太网中允许的最大包长为1500B,当超过网络允许的最大长度时需将过长的数据包分片。
5、标识符(Identifier)长度为16位,用于数据包在分段重组时标识其序列号。
将数据分段后,打包成IP 包,IP包因走的路由上不同,会产生不同的到达目地的时间,到达目地的后再根据标识符进行重新组装还原。
该字段要与标志、段偏移一起使用的才能达到分段组装的目标。
6、标志(Flags)长度为3位,三位从左到右分别是MF、DF、未用。
MF=1表示后面还有分段的数据包,MF=0表示没有更多分片(即最后一个分片)。
TCP/UDP报文格式TCP 协议为终端设备提供了面向连接的、可靠的网络服务,UDP 协议为终端设备提供了无连接的、不可靠的数据报服务。
从上图我们可以看出,TCP 协议为了保证数据传输的可靠性,相对于UDP 报文,TCP 报文头部有更多的字段选项。
首先让我们来看一下TCP 的报文头部主要字段:每个TCP 报文头部都包含源端口号(source port)和目的端口号(destination port),用于标识和区分源端设备和目的端设备的应用进程。
在TCP/IP 协议栈中,源端口号和目的端口号分别与源IP 地址和目的IP 地址组成套接字(socket),唯一的确定一条TCP 连接。
序列号(Sequence number)字段用来标识TCP 源端设备向目的端设备发送的字节流,它表示在这个报文段中的第一个数据字节。
如果将字节流看作在两个应用程序间的单向流动,则TCP 用序列号对每个字节进行计数。
序列号是一个32bits 的数。
既然每个传输的字节都被计数,确认序号(Acknowledgement number,32bits)包含发送确认的一端所期望接收到的下一个序号。
因此,确认序号应该是上次已成功收到的数据字节序列号加1。
TCP 的流量控制由连接的每一端通过声明的窗口大小(windows size)来提供。
窗口大小用数据包来表示,例如Windows size=3, 表示一次可以发送三个数据包。
窗口大小起始于确认字段指明的值,是一个16bits 字段。
窗口大小可以调节。
校验和(checksum)字段用于校验TCP 报头部分和数据部分的正确性。
最常见的可选字段是MSS(Maximum Segment Size,最大报文大小)。
MSS指明本端所能够接收的最大长度的报文段。
当一个TCP 连接建立时,连接的双方都要通告各自的MSS 协商可以传输的最大报文长度。
我们常见的MSS有1024(以太网可达1460 字节)字节。
(转)tcpip协议的简单理解--ip报⽂和tcp报⽂的格式-TCP头部0. ⽂件传输的过程分析
1.概念:
TCP/IP协议通信的过程其实就对应着数据⼊栈与出栈的过程。
⼊栈的过程,数据发送⽅每层不断地封装⾸部与尾部,添加⼀些传输的信息,确保能传输到⽬的地。
出栈的过程,数据接收⽅每层不断地拆除⾸部与尾部,得到最终传输的数据。
2.ip报⽂格式
我感兴趣的只是那⼋位的TTL字段,还记得这个字段是做什么的么?这个字段规定该数据包在穿过多少个路由之后才会被抛弃
(这⾥就体现出来IP协议包的不可靠性,它不保证数据被送达),某个ip数据包每穿过⼀个路由器,该数据包的TTL数值就会减少1,当该数据包的TTL成为零,它就会被⾃动抛弃。
版本(Version):IP协议的版本,⽬前的IP协议版本号为4,下⼀代IP协议版本号为6。
2.tcp报⽂格式
三次握⼿,四次断开:
你们互相打招呼(TCP中的SYN / ACK)
https:///u012371712/article/details/80795297 good article:
##################
package 与 frame 的区别
4. TCP头部 https:///a/194039067_505818。
Wireshark抓包分析TCP.IP.UDP.ICMP报⽂格式(移动互联⽹⽅向)TCP 报⽂格式分析:TCP 报⽂段的报头有 10 个必需的字段和 1 个可选字段。
报头⾄少为 20 字节。
1)源端⼝(16位):标识发送报⽂的计算机端⼝或进程。
⼀个 TCP 报⽂段必须包括源端⼝号,使⽬的主机知道应该向何处发送确认报⽂。
2)⽬的端⼝(16位):标识接收报⽂的⽬的主机的端⼝或进程。
由抓包数据可得源端⼝号为12762,⽬的端⼝号为803)序号(也叫序列号)(32位):⽤于标识每个报⽂段,使⽬的主机可确认已收到指定报⽂段中的数据。
当源主机⽤于多个报⽂段发送⼀个报⽂时,即使这些报⽂到达⽬的主机的顺序不⼀样,序列号也可以使⽬的主机按顺序排列它们。
在建⽴连接时发送的第⼀个报⽂段中,双⽅都提供⼀个初始序列号。
TCP 标准推荐使⽤以 4ms 间隔递增 1 的计数器值作为这个初始序列号的值。
使⽤计数器可以防⽌连接关闭再重新连接时出现相同的序列号。
序列号表达达到2^32 - 1后⼜从0开始,当建⽴⼀个新的连接时,SYN标志为1,系列号将由主机随机选择⼀个顺序号由图可得现序列号为25e4d8a84)确认号(32位):⽬的主机返回确认号,使源主机知道某个或⼏个报⽂段已被接收。
如果 ACK 控制位被设置为 1,则该字段有效。
确认号等于顺序接收到的最后⼀个报⽂段的序号加 1,这也是⽬的主机希望下次接收的报⽂段的序号值。
返回确认号后,计算机认为已接收到⼩于该确认号的所有数据。
由图可得现确认号为59eafa0c5)数据偏移(⾸部长度)(4位)TCP 报⽂段的数据起始处距离 TCP 报⽂段的起始处有多远,即⾸部长度。
由于 TCP 报头的长度随 TCP 选项字段内容的不同⽽变化,因此报头中包含⼀个指定报头字段的字段。
该字段以 32 ⽐特为单位,所以报头长度⼀定是 32 ⽐特的整数倍,有时需要在报头末尾补 0 。
由抓包图有偏移量在0x50中,占4bit,0x50转化为⼆进制数0101 0000 所以偏移量是 0101=5,所以TCP报⽂⾸部长度为5* 4 = 20字节。
TCP报文结构和功能简析
TCP(Transmission Control Protocol,传输控制协议)是互联网中
最常用的一种可靠的传输层协议。
本文将对TCP报文的结构和功能进行详
细的简析。
1.报文头字段:
-源端口和目的端口:用于标识通信双方的端口号,确保数据能够被
正确传送到目的地。
- 序号(Sequence Number):用于标识报文段中的数据的起始位置。
接收方根据序号对报文段进行重新排序,并确保数据的完整性。
- 确认号(Acknowledgment Number):用于确认已经接收到的数据。
发送方根据确认号判断数据是否已经成功送达。
- 数据偏移(Data Offset):用于表示报文头的长度。
数据偏移字
段的单位为4字节,表示报文头的长度为多少个4字节。
-控制位:用于指示TCP报文的控制信息,如SYN、ACK、FIN等。
这
些控制位可以告知TCP的运行状态,协助建立、维护和关闭连接。
- 窗口大小(Window Size):用于告知发送方接收窗口的大小,进
而控制发送速度,确保网络的拥塞不会导致数据丢失。
- 校验和(Checksum):用于检验报文的完整性。
发送方计算校验和,并将结果放置在报文头中,接收方再次计算校验和,并与报文头中的值进
行比对,以确保数据在传输过程中没有发生损坏。
- 紧急指针(Urgent Pointer):用于指示紧急数据的位置。
当报文
中有紧急数据需要传输时,通过紧急指针告知接收方。
TCP系列01—概述及协议头格式⼀、TCP简单介绍我们经常听⼈说TCP是⼀个⾯向连接的(connection-oriented)、可靠的(reliable)、字节流式(byte stream)传输协议, TCP的这三个特性该怎么理解呢?⾯向连接:在应⽤TCP协议进⾏通信之前双⽅通常需要通过三次握⼿来建⽴TCP连接,连接建⽴后才能进⾏正常的数据传输,因此⼴播和多播不会承载在TCP协议上。
(⾕歌提交了⼀个RFC⽂档,建议在TCP三次握⼿的过程允许SYN数据包中带数据,即 TFO(TCP Fast Open),⽬前ubuntu14.04已经⽀持该TFO功能)。
但是同时⾯向连接的特性给TCP带来了复杂的连接管理以及⽤于检测连接状态的存活检测机制。
可靠性:由于TCP处于多跳通信的IP层之上,⽽IP层并不提供可靠的传输,因此在TCP层看来就有四种常见传输错误问题,分别是⽐特错误(packet bit errors)、包乱序(packet reordering)、包重复(packet duplication)、丢包(packet erasure或称为packet drops),TCP要提供可靠的传输,就需要有额外的机制处理这⼏种错误。
因此个⼈理解可靠性体现在三个⽅⾯,⾸先TCP通过超时重传和快速重传两个常见⼿段来保证数据包的正确传输,也就是说接收端在没有收到数据包或者收到错误的数据包的时候会触发发送端的数据包重传(处理⽐特错误和丢包)。
其次TCP接收端会缓存接收到的乱序到达数据,重排序后在向应⽤层提供有序的数据(处理包乱序)。
最后TCP发送端会维持⼀个发送"窗⼝"动态的调整发送速率以适⽤接收端缓存限制和⽹络拥塞情况,避免了⽹络拥塞或者接收端缓存满⽽⼤量丢包的问题(降低丢包率)。
因此可靠性需要TCP协议具有超时与重传管理、窗⼝管理、流量控制、拥塞控制等功能。
另外TFO下TCP有可能向应⽤层提供重复的数据,也就是不可靠传输,但是只会发⽣在连接建⽴阶段,我们后续会进⾏介绍。
视频信息处理与传输实验报告报告名称TCP协议专业班级电子1002班学生姓名学号指导教师实验三TCP一、实验目的1、认识TCP协议的相关内容;2、掌握TCP模块的C语言编程;二、实验内容1、创建一个头文件,用C 语言实现TCP 模块所需的所有常量;2、完成TCP 首部的说明;最大报文段长度MSS(Maximum Segment Size)是TCP 报文段中的数据字段的最大长度。
MSS 告诉对方TCP :“我的缓存所能接收的报文段的数据字段的最大长度是MSS 个字节。
”窗口扩大因子,用于长肥管道。
时间戳,可用于测量往返时延RTT 。
3、完成TCP 报文段的说明;图1 TCP 报文结构源端口和目的端口字段——各占2字节。
端口是传输层与应用层的服务接口。
传输层的复用和分用功能都要通过端口才能实现。
序号字段——占4字节。
TCP 连接中传送的数据流中的每一个字节都编上一个序号。
序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
确认号字段——占4字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
数据偏移——占4bit ,它指出TCP 报文段的数据起始处距离 CP 报文段的起始处有多远。
“数据偏移”的单位不是字节而是32bit 字(4字节为计算单位)。
保留字段——占6bit ,保留为今后使用,但目前应置为0。
紧急比特URG ——当URG =1时,表明紧急指针字段有效。
它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
确认比特ACK ——只有当ACK =1时确认号字段才有效。
当ACK =0时,确认号无效。
复位比特RST(Reset) —— 当RST =1时,表明TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
同步比特SYN ——同步比特SYN 置为1,就表示这是一个连接请求或连接接受报文。
终止比特FIN(FINal)——用来释放一个连接。
TCP报头结构TCP协议头最少20个字节,包括以下的区域:源端口和目的端口我们知道,网络实现的是不同主机的进程间通信。
在一个操作系统中,有很多进程,当数据到来时要提交给哪个进程进行处理呢?这就需要用到端口号。
在TCP头中,有源端口号(Source Port)和目标端口号(Destination Port)。
TCP与UDP段结构中端口地址都是16比特,可以有在0---65535范围内的端口号。
对于这65536个端口号有以下的使用规定:(1)端口号小于256的定义为常用端口,服务器一般都是通过常用端口号来识别的。
任何TCP/IP实现所提供的服务都用1---1023之间的端口号,是由ICANN来管理的;(2)客户端只需保证该端口号在本机上是惟一的就可以了。
客户端口号因存在时间很短暂又称临时端口号;(3)大多数TCP/IP实现给临时端口号分配1024---5000之间的端口号。
大于5000的端口号是为其他服务器预留的。
源端口(Source Port):16位。
源端口号标识了发送主机的进程。
目的端口(Destination port):16位。
目标端口号标识接受方主机的进程。
序列号和确认号例如,pc1向pc2发送数据,该数据为5000字节,该数据到达传输层,使用tcp传输会给每个字节加一个序列号,序列号是从0-2^32之间随机产生的。
比如该报文的第一个字节的序列号为x,第二个字节的序列号就是x+1,最后一个字节的编号就是x+4999。
传输层在传送数据时如果数据比较大会进行分段传送,假设,100个字节分一个片段,那么第一个片段的第一个字节序列号肯定是X,最后一个字节的序列号就是x+99,那么就用X来表示该报文片段。
第二个报文片段的序列号范围是X+100-----X+199,用X+100代表第二个报文片段。
以此类推,第三个X+200---X+299。
当接收方收到第一个报文片段后,如果接受方正确的收到了第一个报文段就会发送一个确认,确认的目的就是表示准确的收到了一个报文,并通知发送方希望继续接受下一个报文段的序号。
如果接收方收到了第一个报文,该报文的序号是X到X+99,如果接受方还想继续接受第二个报文就需要向发送方发送确认号X+100,表示我准确的收到了X--X+99这段数据,我希望你从X+100这个序号继续发送。
序列号(Sequence Number):32位。
用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节。
在TCP传送的数据流中,每一个字节都有一个序号。
序号是32位的无符号数,序号到达2^32-1后又从0开始。
当建立一个新的连接时,SYN标志变为1,序列号字段包含由这个主机选择的该连接的初始序列号ISN(Initial Sequence Number)。
例如,一报文段的序列号为300,此数据共100字节,则下一个报文段的序列号就是400。
确认号(Acknowledgment Number):32位。
包含发送确认的一端所期望收到的下一个序列号。
因此,确认号应当是上次已成功收到数据字节顺序号加1。
只有ACK标志为1时确认号字段才有效。
TCP为应用层提供全双工服务,这意味数据能在两个方向上独立地进行传输。
因此,连接的每一端必须保持每个方向上的传输数据顺序号。
数据偏移(Date offset):4位。
这里的偏移实际指的是TCP首部的长度(不包括数据字段)。
没有任何可选字段的TCP头部长度为20字节;最多可以有60字节的TCP头部。
保留(Reserved):目前没有使用,它的值都为0标志位字段FLAGS(U、A、P、R、S、F):6位。
各比特的含义如下:1为有效,0为无效◆URG:表示TCP包的紧急指针域有效,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据。
◆ACK:表示应答域有效。
◆PSH:表示Push操作。
所谓Push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队。
◆RST:表示连接复位请求即重连接。
用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包。
◆SYN:表示同步序号,用来建立连接。
SYN标志位和ACK标志位搭配使用,当连接请求的时候,SYN=1,ACK=0;连接被响应的时候,SYN=1,ACK= 1;这个标志的数据包经常被用来进行端口扫描。
扫描者发送一个只有SYN的数据包,如果对方主机响应了一个数据包回来,就表明这台主机存在这个端口;但是由于这种扫描方式只是进行TCP三次握手的第一次握手,因此这种扫描的成功表示被扫描的机器不很安全,一台安全的主机将会强制要求一个连接严格的进行TCP的三次握手。
◆FIN:表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开。
这个标志的数据包也经常被用于进行端口扫描。
当一个FIN标志的TCP数据包发送到一台计算机的特定端口,如果这台计算机响应了这个数据,并且反馈回来一个RST标志的TCP包,就表明这台计算机上没有打开这个端口,但是这台计算机是存在的;如果这台计算机没有反馈回来任何数据包,这就表明,这台被扫描的计算机存在这个端口。
窗口(window):16位。
TCP通过滑动窗口的概念来进行流量控制。
设想在发送端发送数据的速度很快而接收端接收速度却很慢的情况下,为了保证数据不丢失,显然需要进行流量控制,协调好通信双方的工作节奏。
所谓滑动窗口,可以理解成接收端所能提供的缓冲区大小。
TCP利用一个滑动的窗口来告诉发送端对它所发送的数据能提供多大的缓冲区。
由于窗口由16位bit所定义,所以接收端TCP 能最大提供65535个字节的缓冲。
由此,可以利用窗口大小和第一个数据的序列号计算出最大可接收的数据序列号。
滑动窗口本质上是描述接受方的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据。
如果发送方收到接受方的窗口大小为0的TCP数据报,那么发送方将停止发送数据,等到接受方发送窗口大小不为0的数据报的到来。
关于滑动窗口协议,还有三个术语,分别是:窗口合拢:当窗口从左边向右边靠近的时候,这种现象发生在数据被发送和确认的时候。
窗口张开:当窗口的右边沿向右边移动的时候,这种现象发生在接受端处理了数据以后。
窗口收缩:当窗口的右边沿向左边移动的时候,这种现象不常发生。
TCP就是用这个窗口,慢慢的从数据的左边移动到右边,把处于窗口范围内的数据发送出去(但不用发送所有,只是处于窗口内的数据可以发送。
)。
这就是窗口的意义。
窗口的大小是可以通过socket来制定的,4096并不是最理想的窗口大小,而16384则可以使吞吐量大大的增加。
A—————C—————B如上图,A与B之间建立TCP连接,滑动窗口实现有两个作用:由于对称性,只考虑A端发送窗口和B端接收窗口,有如下两个作用1。
B端来不及处理接收数据(控制不同速率主机间的同步),这时,A通过B端通知的接收窗口而减缓数据的发送。
2。
B端来得及处理接收数据,但是在A与B之间某处如C,使得AB之间的整体带宽性能较差,此时,A端根据拥塞处理策略(慢启动,加倍递减和缓慢增加)来更新窗口,以决定数据的发送。
与固定大小的滑窗协议相比,TCP采用可变大小的滑窗协议是为了取得更好的性能。
TCP是一个广域网协议,而广域网环境下的路由器和主机,各自有着不同的性能和处理能力,在这种情况下,采用固定窗口大小的滑窗协议会引起性能上的损失。
TCP规定窗口的大小是由接收方通告的,通过采取慢启动和拥塞避免算法等机制来使带宽和性能取得最佳。
TCP协议在工作时,如果发送端的TCP协议软件每传输一个数据分组后,必须等待接收端的确认才能够发送下一个分组,由于网络传输的时延,将有大量时间被用于等待确认,导致传输效率低下。
为此TCP在进行数据传输时使用了滑动窗口机制。
TCP滑动窗口用来暂存两台计算机间要传送的数据分组。
每台运行TCP协议的计算机有两个滑动窗口:一个用于数据发送,另一个用于数据接收。
发送端待发数据分组在缓冲区排队等待送出。
被滑动窗口框入的分组,是可以在未收到接收确认的情况下最多送出的部分。
滑动窗口左端标志X的分组,是已经被接收端确认收到的分组。
随着新的确认到来,窗口不断向右滑动。
TCP协议软件依靠滑动窗口机制解决传输效率和流量控制问题。
它可以在收到确认信息之前发送多个数据分组。
这种机制使得网络通信处于忙碌状态,提高了整个网络的吞吐率,它还解决了端到端的通信流量控制问题,允许接收端在拥有容纳足够数据的缓冲之前对传输进行限制。
在实际运行中,TCP滑动窗口的大小是可以随时调整的。
收发端TCP协议软件在进行分组确认通信时,还交换滑动窗口控制信息,使得双方滑动窗口大小可以根据需要动态变化,达到在提高数据传输效率的同时,防止拥塞的发生。
称窗口左边沿向右边沿靠近为窗口合拢,这种现象发生在数据被发送和确认时。
当窗口右边沿向右移动时将允许发送更多的数据,称之为窗口张开。
这种现象发生在另一端的接收进程读取已经确认的数据并释放了TCP的接收缓存时。
当右边沿向左移动时,称为窗口收缩。
Host Requirements RFC强烈建议不要使用这种方式。
但TCP必须能够在某一端产生这种情况时进行处理。
如果左边沿到达右边沿,则称其为一个零窗口。
校验和(Checksum):16位。
对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。
这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。
紧急指针(Urgent Pointer):16位。
一般不使用。
只有当U R G标志置1时紧急指针才有效。
紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。
TCP是面向数据流的协议,但当应用程序在某些紧急情况下(如某些连接强制中断)要求在接收方在没有处理完数据之前就能够发送一些紧急数据,这就使得发送方将URG置为1 即紧急指针字段有效,这样可以不必考虑你发送的紧急数据在数据流中的位置也就是相当于优先级最高,紧急指针指出的是紧急数据在报文段中结束的位置。