(六)TCP与UDP--图解TCP/IP_tcpudp协议的服务图-程序员宅基地

技术标签: tcp  TCP/IP  

主要介绍传输层的两个主要协议TCP(Transmission Control Protocol)与UDP(User Datagram Protocol)。

传输层的作用

TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。

传输层定义

IP首部有一个协议字段,用来标识网络层(IP)的上一层所采用的是哪一种传输层协议。根据这个字段的协议号,就可以识别IP传输的数据部分究竟是TCP的内容还是UDP的内容。

同样,传输层的TCP和UDP,为了识别自己所传输的数据部分究竟应该发给哪个应用,也设定了这样一个编号。

在TCP/IP通信中需要指定“应用程序”。而传输层必须指出这个具体的程序,为了实现这一功能,使用端口号这样一种识别码。根据端口号可以识别在传输层上一层的应用层中所要进行处理的具体程序。

通信处理

服务端程序在UNIX系统当中叫做守护进程。例如HTTP的服务端程序是httpd(HTTP守护进程),而ssh的服务端程序是sshd(SSH守护进程)。UNIX中并不需要将这些守护进程逐个启动,而是启动一个可以代表它们接收客户端请求的inetd(互联网守护进程)服务程序即可。它是一种超级守护进程。该超级守护进程收到客户端请求以后会创建(fork)新的进程并转换(exec)为sshd等各个守护进程。

确认一个请求究竟发给的是哪个服务端(守护进程),可以通过所收到数据包的目标端口号轻松识别。当收到TCP的建立连接请求时,如果目标端口为22,则转给sshd,如果是80则转给httd。然后,这些守护进程会继续对该连接上的通信传输进行处理。

传输协议TCP、UDP通过接收数据中的目标端口识别目标处理程序。以下图为例,传输协议的数据将被传递给HTTP、TELNET以及FTP等应用层协议。

HTTP连接请求:

这里写图片描述

两种传输层协议TCP和UDP

TCP

TCP是面向连接的、可靠的流协议。流就是指不间断的数据结构,你可以把它想象成排水管道中的水流。TCP为提供可靠性传输,实行“顺序控制”或“重发控制”机制。此外还具备“流控制(流量控制)”、“拥塞控制”、提高网络利用率等众多功能。

UDP

UDP是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。UDP情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。

TCP与UDP区分

TCP用于在传输层有必要实现可靠传输的情况。由于它是面向有连接并具备顺序控制、重发控制等机制的,所以他可以为应用提供可靠传输。

UDP主要用于那些对高速传输和实时性有较高要求的通信或广播通信。多播和广播通信中也使用UDP而不是TCP。RIP、DHCP等基于广播的协议也要依赖于UDP。

套接字(Socket)
使用TCP或UDP通信时,会广泛使用到套接字(socket)的API。套接字原本是由BSD UNIX开发的,但是后被移植到Windows以及嵌入式操作系统中。
应用程序利用套接字,可以设置对端的IP地址、端口号,并实现数据的发送和接收。
这里写图片描述

端口号

端口号定义

数据链路和IP中的地址,分别指的是MAC地址和IP地址。前者用来识别同一链路中不同的计算机,后者用来识别TCP/IP网络中互连的主机和路由器。传输层也有类似概念,就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。

根据端口号识别应用

这里写图片描述

通过IP地址、端口号、协议号进行通信识别

TCP/IP或UDP/IP通信中通常采用5个信息来识别一个通信。它们是“源IP地址”、“目标IP地址”、“协议号”、“源端口号”、“目标端口号”。只要其中某一项不同,则被认为是其他通信。

这里写图片描述

端口号如何确定

确定端口号的方法分为两种:

标准既定的端口号

这种方法也叫静态方法。它是指每个应用程序都有其指定的端口号。但并不是说可以随意使用任何一个端口号。每个端口号都有其对应的使用目的。

HTTP、TELNET、FTP等端口号就是固定的。这些端口号被称之为知名端口号(Well-Known Port Number)。知名端口号一般由0到1023的数字分配而成。

时序分配法

第二种方法也叫时序(或动态地)分配法。此时,服务器有必要确定监听端口号,但是接受服务的客户端没必要确定端口号。

这种方式下,客户端应用程序可以完全不用自己设置端口号,而全权交给操作系统进行分配。

动态分配的端口号取值范围在49152到65535之间。

端口号与协议

端口号由其使用的传输层协议决定。因此,不同的传输协议可以使用相同的端口号。例如,TCP与UDP使用同一个端口号,但使用目的各不相同。

数据到达IP层后,会先检查IP首部中的协议号,再传给相应协议的模块。传给TCP或UDP去做端口号处理。就是是同一个端口号,由于传输协议是各自独立地进行处理,因此相互之间不会影响。

那些知名端口号与传输层协议并无关系,只要端口一致都将分配同一种程序进行处理。例如,53端口在TCP与UDP中都用于DNS服务(由域名确定IP地址时所用的协议),80端口用于HTTP通信。从目前看,由于HTTP通信必须使用TCP,所以UDP的80端口并未投入使用。

UDP

UDP时User Datagram Protocol的缩写。
UDP不提供复杂控制机制,利用IP提供面向无连接的通信服务。且它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。

UDP面向无连接,可以随时发送数据。它常用于几个方面:

  • 包总量较少的通信(DNS、SNMP等)
  • 视频、音频等多媒体通信(即时通信)
  • 限定于LAN等特定网络中的应用通信
  • 广播通信(广播、多播)

TCP

TCP充分实现了数据传输时各种控制功能,根据TCP这些机制,在IP这种无连接的网络上也能够实现高可靠性的通信。

TCP的特点及其目的

TCP通过校验和、序列号、确认应答、重发机制、连接管理以及窗口控制等机制实现可靠性传输。

通过序列号与确认应答提高可靠性

在TCP中,当发送端数据到达接受主机时,接收端主机会返回一个已收到的消息的通知。这个消息叫做确认应答(ACK Positive Acknowledgement)。

正常的数据传输:

这里写图片描述

TCP通过肯定的确认应答(ACK)实现可靠的数据传输。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。

在一定时间内没有等到确认应答,发送端就可以认为数据已经丢失,并进行重发。由此,即使产生了丢包,仍然能够保证数据能够叨叨对端,实现可靠传输。

这里写图片描述

未确认应答并不意味着数据一定丢失。也有可能是数据对方已经收到,只是返回的确认应答在途中丢失。

这里写图片描述

为了防止出现随意重发的情况,就需要引入一种机制,它能够识别是否已经接收数据,又能判断是否需要接收。

这些确认应答处理、重发控制以及重复控制等功能都可以通过序列号实现。序列号是按照顺序给发送数据的每个字节(8位字节)都标上号码的编号(序列号的初始值并非为0。而是在建立连接以后由随机数生成。而后面的计算则是对每一字节加一)。接收端查询接收数据TCP首部中序列号和数据的长度,将自己下一步应该接收的序列号作为确认硬代返送回去。这样,通过序列号和确认应答号,TCP可以实现可靠传输。

序列号(或确认应答号)也指字节与字节之间的分隔。

TCP的数据长度并未写入TCP首部。实际通信中求得TCP包的长度的计算公式是:IP首部中的数据包长度-IP首部长度TCP首部长度。

这里写图片描述

重发超时如何确定

TCP要求不论处在何种网络环境下都要提供高性能通信,并且无论网络拥堵情况发生何种变化,都必须保持这一特性。为此,它在每次发包时都会计算往返时间(RTT Round Trip Time 指报文段的往返时间)及偏差(RTT时间波动的值,方差。有时也叫抖动)。将这个往返时间和偏差相加重发超时的时间,就是比这个综合要稍大一点的值。

连接管理

TCP提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好通信两端之间的准备工作。

UDP是一种面向无连接的通信协议,因此不检查对端是否可以通信,直接将UDP包发出去。TCP与此相反,它会在数据通信之前,通过TCP首部发送一个SYN包作为建立连接的请求等待确认应答(TCP中发送第一个SYN包的一方叫客户端,接收这个的一方叫服务端)。如果对端发来确认应答,则认为可以进行数据通信。如果对端的确认应答未能到达,就不会进行数据通信。此外,在通信结束时会进行断开连接的处理(FIN包)。

可以使用TCP首部用于控制的字段来管理TCP连接(也叫控制域)。一个连接的建立与断开,正常过程至少需要来回发送7个包才能完成。(建立一个TCP连接需要发送3个包,这个过程也称为3次握手

这里写图片描述

TCP以段为单位发送数据

在建立TCP连接的同时,也可以确定发送数据包的单位,我们也可以称其为“最大消息长度”(MSS:Maximum Segment Size)。最理想的情况是,最大消息长度正好是IP中不会被分片处理的最大数据长度。

TCP在传输大朗数据时,是以MSS的大小将数据进行分割发送的。进行重发时也是以MSS为单位。

MSS是在三次握手的时候,在两端主机之间被计算得出。两端的主机在发出建立连接的请求时,会在TCP首部中写入MSS选项,告诉对方自己的接口能够适应的MSS的大小(为附加MSS选项,TCP首部将不再是20字节,而是4字节的整数倍)。然后会在两者之间选择一个较小的值投入使用(在建立连接时,如果某一方的MSS选项被省略,可以选为IP包的长度不超过576字节的值(IP首部20字节,TCP首部20字节,MSS 536字节))。

接入以太网主机以接入FDDI主机之间通信的情况:

这里写图片描述

利用窗口控制提高速度

TCP以1个段为单位,每发一个段进行一次确认应答的处理,如下图,这样传输的缺点是,包的往返时间越长通信性能就越低。

这里写图片描述

为解决这个问题,TCP引入了窗口这个概念。如下图,确认应答不再是以每个分段,而是以更大的单位进行确认时,转发时间将会被大幅度的缩短。就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。

窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。如下图中,窗口大小为4个段。

这个机制实现了使用大量的缓冲区(Buffer 在此处标识临时保存收发数据的场所。通常是在计算机内存中开辟的一部分空间),通过对多个段同时进行确认应答的功能。

用滑动窗口方式并行处理:

这里写图片描述

下面的图中发送数据中高亮圈起的部分正是前面所提到的窗口。在这个窗口内的数据即便没有收到确认应答也可以发送出去。此外,从该窗口中能看到的数据因其某种数据已在传输中丢失,所以发送端才能收到确认应答,这种情况也需要重发。为此,发送端主机在等到确认应答返回之前,必须在缓冲区中保留这部分数据。

在滑动窗口以外的部分包括尚未发送的数据以及已经确认对端已收到的数据。当数据发出后若如期收到确认应答就可以不用再重发,此时数据皆可以从缓冲区清除。

收到确认应答,将窗口滑动到确认硬代中的需要的位置。这样可以顺序地将多个段同时发送提高通信性能。这种机制也被称为滑动窗口控制。

滑动窗口方式:

这里写图片描述

窗口控制与重发控制

使用窗口控制中, 如果出现段丢失怎么办?

首先考虑确认应答未能返回的情况。这种情况下,数据已经达到对端,是不需要进行重发的。然而,在没有使用窗口控制的时候,没有收到确认应答的数据会被重发。而使用了窗口控制,如下图,某些确认应答即便丢失也无需重发。

这里写图片描述

其次,考虑一下某个报文段丢失的情况。如下图,接收主机如果收到一个自己应该接收的序号以外的数据时,会针对当前位置收到数据返回确认应答(不过即使接收端主机收到的包序号并不连续,也不会将数据丢弃而是暂时保存至缓冲区中)。

当某一报文段丢失后,发送端会一直收到序号为1001的确认应答,这个确认应答好像在提醒发送端“我想接收的是从1001开始的数据”。因此,在窗口比较大,又出现报文段丢失的情况下,同一个序号的确认应答将会被重复不断地返回。而发送端主机如果连续3次收到同一个确认应答(之所以连续收到3次而不是两次的理由是因为,即使数据段的序号被替换两次也不会触发重发机制)。就会将其所对应的数据进行重发。这种机制比之前提到的超时管理更加高效,因此也被称作高速重发控制。

高速重发控制(Fast Retransmission)

这里写图片描述

流控制

发送端根据自己的实际情况发送数据。但是,接收端可能收到的是一个毫无关系的数据包有可能会在处理其他问题上花费一些时间。因此在为这个数据包做其他处理时会耗费一些时间,甚至在高负荷情况下无法接收任何数据。如此一来,如果接收端将本应该接收的数据丢弃的话,就又会触发重发机制,从而导致网络流量的浪费。

为了防止这种现象发生,TCP提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量。这就是所谓的流控制。它的具体操作时,接收端主机向发送端主机通知自己可以接收数据的大小,于是发送端会发送不超过这个限制的数据。该大小限度就被称为窗口大小。

TCP首部中,专门有一个字段用来通知窗口大小。接收主机将自己的可以接收的缓冲区大小放入这个字段通知给发送端。这个值越大,说明网络的吞吐量越高。

不过,接收端这个缓冲区一旦面临数据溢出时,窗口大小的值也会随之被设置为一个更小的值通知给发送端,从而控制数据发送量。就是说,发送端主机会根据接收端主机的指示,对发送数据的量进行控制。这也形成了一个完整的TCP流控制(流量控制)。

根据窗口大小控制流量过程示例:

这里写图片描述

当接收端收到从3001号开始的数据段后其缓冲区即满,不得不暂时停止接收数据。之后,在收到发送窗口更新通知后通信才得以继续进行。如果这个窗口更新通知在传输途中丢失,可能会导致无法继续通信。为避免此类问题,发送端主机会时不时发送一个叫做窗口探测的数据段,此数据段仅含一个字节以获取最新的窗口大小信息。

拥塞控制

有了TCP窗口控制,收发主机之间即使不再以一个数据段为单位发送确认应答,也能够连续发送大量数据包。然而,如果在通信刚开始就发送大量数据,也可能会引发其他问题。

TCP为了防止该问题的出现,在通信一开始就会通过一个叫做慢启动的算法得出的数值,对发送数据量进行控制。

这里写图片描述

使用TCP的应用

如果需要应用自己处理一些更为细节上的控制,使用UDP协议是不错的选择。如果转发数据量较多、对可靠性的要求比较高时,可以选择使用TCP。

其他传输层协议

UDP-Lite

UDP-Lite(Lightweight User Datagram Prtotocol,轻量级用户数据协议)是扩展UDP机能的一种传输层协议。在基于UDP的通信当中如果检验和出现错误,所收到的包将被全部丢弃。然而,现实操作中,有些应用(例如那些使用H.263+,H.264,MPEG-4等图像与音频数据格式的应用)在面对这种情况时并不希望把已经收到的所有包丢弃。

如果将UDP中校验和设置为无效,那么即使数据的一部分发生错误也不会将整个包废弃。不过,这不是一个很好的方法。因为如果发生的错误有可能是UDP首部中的端口号被破坏或是IP首部中的IP地址被破坏(识别一个通信需要IP地址,而UDP的校验和可以检查IP地址是否正确),就会产生严重后果。因此,不建议将校验和关闭。为了解决这些问题,UDP的修正版UDP-Lite协议就出现了。

UDP-Lite提供与UDP几乎相同的功能,不过计算校验和的范围可以由应用自行决定。这个范围可以是包加上伪首部的校验和计算,可以是首部与伪首部的校验和计算,也可以是首部、伪首部与数据从起始到中间某个位置的校验和计算(在UDP首部有一个字段标识“包长”。在这个字段里放入是从协议首部的第1个字节到第多少个字节要进行校验和计算的部分。如果值为0表示整个包都要进行校验和计算,如果值为8标识只对首部与伪首部进行校验和计算。)。有了这种机制,就可以只针对不允许发生错误的部分进行校验和的检查。对于其他部分,即使发生了错误,也会被忽略。而这个包也不会被丢弃,而是直接传给应用继续处理。

TCP和UDP的伪首部
伪首部(pseudo header),通常有TCP伪首部和UDP伪首部。在UDP/TCP伪首部中,包含32位源IP地址,32位目的IP地址,8位填充0,8位协议,16位TCP/UDP长度。通过伪首部的校验,UDP可以确定该数据报是不是发给本机的,通过首部协议字段,UDP可以确认有没有误传。
伪首部并非TCP&UDP数据报中实际的有效成分。伪首部是一个虚拟的数据结构,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算校验和。

SCTP

SCTP(Stream Control Transmission,流控制传输协议)与TCP一样,都是对一种提供数据到达与否相关可靠性检查的传输层协议。特点如下:

  • 以消息为单位收发
    TCP中接收端并不知道发送端应用所决定的消息大小。在SCTP中却可以。
  • 支持多重宿主
    在有多个NIC的主机中,即使其中能够使用NIC发生变化,也仍然可以继续通信(比TCP提高了故障应对能力)。
  • 支持多数据流通信
    TCP中建立多个连接以后才能进行通信的效果,在SCTP中一个连接就可以(吞吐量有提升)。
  • 可以定义消息的生存期限
    超过生存期限的消息,不会被重发。

SCTP主要用于进行通信应用之间发送众多较小消息的情况。这些较小应用消息被称作数据块(Chunk),多个数据块组成一个数据包。

此外,SCTP具有支持多重宿主以及设定多个IP地址的特点。多重宿主是指同一台主机具备多种网络的接口。例如,笔记本电脑可以连接以太网又可以连接无线LAN。

同时使用以太网和无线LAN时,各自的NIC会获取到不同的IP地址。进行TCP通信,如果开始时使用的是以太网,而后又切换为无线LAN,那么连接将会被断开。因为从SYN到FIN包必须使用同一个IP地址。

在SCTP情况下,由于可以管理多个IP地址使其同时进行通信,因此即使出现通信过程中以太网与无线LAN之间的切换,也能够保持通信不中断。所以SCTP可以为具备多个NIC的主机提供更可靠的传输(持有多个NIC的应用服务器中,即使某一个NIC发生故障,只要有一个能够正常工作的NIC就可以保持通信无阻)。

DCCP

DCCP(Datagram Congestion Control Protocol,数据报拥塞控制协议)是一个辅助UDP的崭新的传输层协议。UDP没有拥塞控制机制。为此,当应用使用UDP发送大量数据包时容易出现问题。互联网通信,即使使用UDP也应该控制拥塞。

DCCP具有如下几个特点:

  • 与UDP一样,不能提供发送数据的可靠性传输。
  • 它面向连接,具备建立连接与断开连接的处理。在建立和断开连接上是具有可靠性。
  • 能够根据网络拥塞情况进行拥塞控制。使用DCCP应用可以根据自身特点选择两种方法进行拥塞控制。分别是“类似TCP(TCP-Like)拥塞控制”和“TCP友好升级控制(TCP-Friendly Rate Control)”。
  • 为了进行拥塞控制,接收端收到包以后返回确认应答(ACK)。该确认应答将被用于重发与否的判断。

UDP首部的格式

下图展示了UDP首部的格式。除去数据的部分正式UDP的首部。UDP首部由源端口号,目标端口号,包长和校验和组成。

这里写图片描述

源端口号(Source Port)

表示发送端端口号,字段长16位。该字段是可选项,有时可能不会设置源端口号。没有源端口号的时候该字段的值设置为0。可用于不需要返回的通信中。

目标端口号(Destination Port)

表示接收端端口,字段长度16位。

包长度(Length)

该字段保存了UDP首部的长度跟数据的长度之和。单位为字节(8位字节)。

校验和(Checksum)

校验和是为了提供可靠的UDP首部和数据而设计。在计算校验和时,附加在UDP伪首部与UDP数据报之前。通过在最后一位增加一个“0”将全长增加16倍。此时将UDP首部的校验和字段设置为“0”。然后以16比特为单位进行1的补码和,并将所得到的1的补码和写入校验和字段。

这里写图片描述

源码、反码、补码
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
1. 原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原= 0000 0001
[-1]原= 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111]

[-127 , 127]
原码是人脑最容易理解和计算的表示方式.
2. 反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原= [00000001]反
[-1] = [10000001]原= [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.
3. 补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原= [00000001]反= [00000001]补
[-1] = [10000001]原= [11111110]反= [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.

接收主机在收到UDP数据报以后,从IP首部获知IP地址信息构造UDP伪首部,再进行校验和计算。校验和制度按的值是校验和字段以外余下部分的1的补码和。因此,包括校验和字段在内的所有数据之和结果为“16位全部为1”时,才会被认为所收到的数据时正确的。

另外,UDP也可有可能不用校验和。此时,校验和字段中填入0.这种情况下,由于不进行校验和计算,协议处理的开销(在处理实际数据之外,为了进行通信控制的处理而不得不付出的必要的消耗部分)就会降低,从而提高数据转发的速度。然而,如果UDP首部的端口号或是IP首部的IP地址遇到损坏,那么可能会对其他通信造成不好的影响。因此,在互联网中比较推荐使用校验和检查。

校验和计算中计算UDP伪首部的理由
TCP/IP中识别一个通信的应用需要5大要素,它们分别是“源IP地址”、“目标IP地址”、“源端口”、“目标端口”、“协议号”。然而,在UDP的首部中只包含它们当中的两项(源端口和目标端口),余下的3项都包含在IP首部里。

假定其他3项都被破坏?显然,这极有可能会导致应该收包的应用收不到包,不该收到包的应用却收到了包。

为了避免这类问题,有必要验证一个通信中必要的5项识别码是否正确。为此,在校验和的计算中就引入和伪首部的概念。

此外,IPv6中的IP首部没有检验和字段。TCP和UDP通过伪首部,得以对5项数字进行校验,从而实现即使在IP首部并不可靠的情况下仍然能够提供可靠的通信传输。

TCP首部格式

这里写图片描述

TCP中没有表示包长度和数据长度的字段。可由IP层获知TCP的包长,由TCO的包长可知数据的长度。

源端口号(Source Port)

表示发送端端口号,字段长16位。

目标端口号(Destination Port)

表示接收端端口号,字段长度16位。

序列号(Sequence Number)

字段长32位。序列号(序号)是指发送数据的位置,每发送一次数据,就累加一次该数据字节数的大小。

序列号不会从0或1开始,而是建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机。然后再将每转发过去的字节数累加到初始值上表示数据的位置。此外,在建立连接和断开连接时发送的SYN包和FIN包虽然并不携带数据,但是也会作为一个字节增加对应的序列号。

确认应答号(Acknowledgement Number)

确认应答号字段长度32位。是指下一次应该受到的数据的序列号。实际上,它是指已收到确认应答号减一为止的数据。发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。

数据偏移(Data Offset)

该字段表示TCP所传输的数据部分应该从TCP包的哪个位开始计算,当然也可以把它看做TCP首部的长度。该字段长4位,单位为4字节(即32位)。

保留(Reserved)

该字段主要是为了以后扩展时使用,其长度为4位。一般设置为0,但即使收到的包在该字段不为0,此包也不会被丢弃。

控制位(Control Flag)

字段长为8位,每一位从左至右分别为CWR、ECE、URG、ACK、PSH、RST、SYN、FIN。这些控制标志也叫作控制位。

  • CWR(Congestion Window Reduced)
    CWR标志与后面的ECE标志都用于IP首部的ECN字段。ECE标志为1时,则通知对方已将拥塞窗口缩小。
  • ECE(ECN-Echo)
    ECE标志表示ECN-Echo。置为1会通知通信对方,从对方到这边的网络有拥塞。在收到数据包的IP首部中ECN为1时将TCP首部中的ECE设置为1。
  • URG(Urgent Flag)
    该位为1时,确认应答的字段变为有效。TCP规定除了最初建立连接时的SYN包之外该位必须设置为1。
  • PSH(Push Flag)
    该位为1时,表示需要将受到的数据立即传给上层应用协议。PSH为0时,则不需要立即传而是先进性缓存。
  • RST(Reset Flag)
    该位为1时表示TCP连接中出现异常必须强制断开连接。
  • SYN(Synchronize Flag)
    用于建立连接。SYN为1 表示希望建立连接,并在其序列号的字段进行序列号初始值的设定。
  • FIN(Fin Flag)
    该位为1时,表示今后不会再有数据发送,希望断开连接。

窗口大小(Window Size)

该字段长为16位。用于通知从相同TCP首部的确认应答号所指位置开始能够接收的数据大小(8位字节)。TCP不允许发送超过此处所示大小的数据。不过,如果窗口为0,则表示可以发送窗口探测,以了解最新的窗口大小。但这个数据必须是1个字节。

校验和(Checksum)

TCP的校验和与UDP相似,区别在于TCP的校验和无法关闭。
TCP和UDP一样在计算校验和的时候使用TCP伪首部。

接收端在收到TCP数据段以后,从IP首部获取IP地址信息构造TCP伪首部,再进行校验和计算。由于校验和字段里保存着除本字段以外洽谈部分的和的补码值,一次如果计算校验和字段在内的所有数据的16位和以后,得出的结果是“16位全部为1”说明所收到数据是正确的。

紧急指针(Urgent Pointer)

选项(Options)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_37138973/article/details/72822229

智能推荐

js-选项卡原理_选项卡js原理-程序员宅基地

文章浏览阅读90次。【代码】js-选项卡原理。_选项卡js原理

设计模式-原型模式(Prototype)-程序员宅基地

文章浏览阅读67次。原型模式是一种对象创建型模式,它采用复制原型对象的方法来创建对象的实例。它创建的实例,具有与原型一样的数据结构和值分为深度克隆和浅度克隆。浅度克隆:克隆对象的值类型(基本数据类型),克隆引用类型的地址;深度克隆:克隆对象的值类型,引用类型的对象也复制一份副本。UML图:具体代码:浅度复制:import java.util.List;/*..._prototype 设计模式

个性化政府云的探索-程序员宅基地

文章浏览阅读59次。入选国内首批云计算服务创新发展试点城市的北京、上海、深圳、杭州和无锡起到了很好的示范作用,不仅促进了当地产业的升级换代,而且为国内其他城市发展云计算产业提供了很好的借鉴。据了解,目前国内至少有20个城市确定将云计算作为重点发展的产业。这势必会形成新一轮的云计算基础设施建设的**。由于云计算基础设施建设具有投资规模大,运维成本高,投资回收周期长,地域辐射性强等诸多特点,各地在建...

STM32问题集之BOOT0和BOOT1的作用_stm32boot0和boot1作用-程序员宅基地

文章浏览阅读9.4k次,点赞2次,收藏20次。一、功能及目的 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序。BOOT1=x BOOT0=0 // 从用户闪存启动,这是正常的工作模式。BOOT1=0 BOOT0=1 // 从系统存储器启动,这种模式启动的程序_stm32boot0和boot1作用

C语言函数递归调用-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏22次。C语言函数递归调用_c语言函数递归调用

明日方舟抽卡模拟器wiki_明日方舟bilibili服-明日方舟bilibili服下载-程序员宅基地

文章浏览阅读410次。明日方舟bilibili服是一款天灾驾到战斗热血的创新二次元废土风塔防手游,精妙的二次元纸片人设计,为宅友们源源不断更新超多的纸片人老婆老公们,玩家将扮演废土正义一方“罗德岛”中的指挥官,与你身边的感染者们并肩作战。与同类塔防手游与众不同的几点,首先你可以在这抽卡轻松获得稀有,同时也可以在战斗体系和敌军走位机制看到不同。明日方舟bilibili服设定:1、起因不明并四处肆虐的天灾,席卷过的土地上出..._明日方舟抽卡模拟器

随便推点

Maven上传Jar到私服报错:ReasonPhrase: Repository version policy: SNAPSHOT does not allow version: xxx_repository version policy snapshot does not all-程序员宅基地

文章浏览阅读437次。Maven上传Jar到私服报错:ReasonPhrase: Repository version policy: SNAPSHOT does not allow version: xxx_repository version policy snapshot does not all

斐波那契数列、素数、质数和猴子吃桃问题_斐波那契日-程序员宅基地

文章浏览阅读1.2k次。斐波那契数列(Fibonacci Sequence)是由如下形式的一系列数字组成的:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …上述数字序列中反映出来的规律,就是下一个数字是该数字前面两个紧邻数字的和,具体如下所示:示例:比如上述斐波那契数列中的最后两个数,可以推导出34后面的数为21+34=55下面是一个更长一些的斐波那契数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,_斐波那契日

PHP必会面试题_//该层循环用来控制每轮 冒出一个数 需要比较的次数-程序员宅基地

文章浏览阅读363次。PHP必会面试题1. 基础篇1. 用 PHP 打印出前一天的时间格式是 2017-12-28 22:21:21? //>>1.当前时间减去一天的时间,然后再格式化echo date('Y-m-d H:i:s',time()-3600*24);//>>2.使用strtotime,可以将任何字符串时间转换成时间戳,仅针对英文echo date('Y-m-d H:i:s',str..._//该层循环用来控制每轮 冒出一个数 需要比较的次数

windows用mingw(g++)编译opencv,opencv_contrib,并install安装_opencv mingw contrib-程序员宅基地

文章浏览阅读1.3k次,点赞26次,收藏26次。windows下用mingw编译opencv貌似不支持cuda,选cuda会报错,我无法解决,所以没选cuda,下面两种编译方式支持。打开cmake gui程序,在下面两个框中分别输入opencv的源文件和编译目录,build-mingw为你创建的目录,可自定义命名。1、如果已经安装Qt,则Qt自带mingw编译器,从Qt安装目录找到编译器所在目录即可。1、如果已经安装Qt,则Qt自带cmake,从Qt安装目录找到cmake所在目录即可。2、若未安装Qt,则安装Mingw即可,参考我的另外一篇文章。_opencv mingw contrib

5个高质量简历模板网站,免费、免费、免费_hoso模板官网-程序员宅基地

文章浏览阅读10w+次,点赞42次,收藏309次。今天给大家推荐5个好用且免费的简历模板网站,简洁美观,非常值得收藏!1、菜鸟图库https://www.sucai999.com/search/word/0_242_0.html?v=NTYxMjky网站主要以设计类素材为主,办公类素材也很多,简历模板大部个偏简约风,各种版式都有,而且经常会更新。最重要的是全部都能免费下载。2、个人简历网https://www.gerenjianli.com/moban/这是一个专门提供简历模板的网站,里面有超多模板个类,找起来非常方便,风格也很多样,无须注册就能免费下载,_hoso模板官网

通过 TikTok 联盟提高销售额的 6 个步骤_tiktok联盟-程序员宅基地

文章浏览阅读142次。你听说过吗?该计划可让您以推广您的产品并在成功销售时支付佣金。它提供了新的营销渠道,使您的产品呈现在更广泛的受众面前并提高品牌知名度。此外,TikTok Shop联盟可以是一种经济高效的产品或服务营销方式。您只需在有人购买时付费,因此不存在在无效广告上浪费金钱的风险。这些诱人的好处是否足以让您想要开始您的TikTok Shop联盟活动?如果是这样,本指南适合您。_tiktok联盟