96SEO 2026-02-19 12:03 17
https://datatracker.ietf.org/doc/html/rfc793

https://datatracker.ietf.org/doc/html/rfc793
是一个高可靠的主机到主机之间的通讯协议这些主机通常位于分组交换网络基于
本文档主要关注军事方面的通讯需求特别是如何实现可靠的通讯以及在出现网络拥塞时如何保证网络可用性这些问题也同样出现在政府和社会通讯系统中。
随着战略战术计算机通讯网络的研发和部署有必要提供一些连通这些网络的方法以及可以支持大部分应用进程可以互相通讯的标准协议。
出于对这种标准的需要负责研究与工程的副部长助理将本文讨论的
是面向连接的、端到端的可靠通讯协议它被设计到一个支持多网络应用的层级网络协议栈中。
TCP
主要为两个不同主机中的进程提供可靠的通讯服务这两个主机处于独立并且相互连通的计算机通讯网络中。
在网络协议栈OSI
可以在很多种类的通讯系统上运行其中包括分组交换网络、电路交换网络虚电路、硬线连接的网络等。
数据段拆包相关信息这些信息可以穿过不同的网络保证了端进程到端之间的通信。
协议实现程序需要和主机中的上层协议实现程序共同运行。
有些计算机系统需要通过一个前端机去联网这个前端机安装有
规范为上层网络协议提供了一套接口这套接口同样适合前端机场景只要主机到前端机之间实现了相关的通讯协议host-to-front
为在多网络环境中的主机进程提供进程到进程的可靠通讯服务。
TCP
程序进行交互所需要的规则。
本章剩余部分对协议接口和具体操作进行了详细地描述。
第二章总结了
设计的哲学基础。
第三章描述了不同的事件新数据段到达、用户调用、出错等出现的时候
之间的接口这个接口包括一组调用这种调用类似于操作系统为应用程序提供的操作文件的系统调用。
比如用来打开链接和关闭链接的调用在建立的链接上发送数据和接收数据的调用。
同时
组件和应用程序异步通讯的功能比较受期待。
针对特定的操作系统平台TCP
之间的接口任何合理的实现都应该保持一个约定的最小范围内的功能列表。
和底层协议之间没有规定具体的实现细节但是假设有一种机制可以在两层协议间进行异步的消息传递。
通常人们希望底层协议会定义一个这样的异步接口。
这里的底层协议在本文档中一般指
主要的目的是为两个不同进程间提供可靠的、安全的逻辑电路logical
circuit或者连接connection服务。
在不可靠的网络通讯系统中提供这种稳定可靠的服务需要在以下几个领域具备基本的实现facilities
可以在两个用户进程之间进行双向的字节流传输它是通过把一定数量的字节放在数据段中并在网络上传输来实现字节流传输的。
通常TCP
定义了一个推数据PUSH的功能。
发送者需要指定要把数据推送PUSH到接收方才能保证提交给
的数据被发送出去。
一个推的指令会立即把在那个时刻收集到的数据data
指令的准确时间接收方可能不会知道并且推送功能也不会提供这次推送的数据量相关信息。
必须能解决由通讯网络造成的数据损坏、丢失、重复、或者乱序问题。
TCP
通过给每个字节添加递增序列号并且要求接收方收到数据后发送一个确认ack来解决上述问题。
如果在一定时间内没有收到确认发送方会再次发送数据。
接收方通过序列号为乱序的字节排序并且可以把重复的数据段丢弃。
通过给每个传送的数据段添加校验和可以检测数据是否被破坏接收方收到数据后检测校验和并丢弃受到破坏的数据段。
运行良好并且通讯网络不会出现完全独立的两个子网网络分区数据的传输错误一般都不会影响数据的正常分发。
TCP
为接收方提供一种可以控制发送方发送数据量的方法。
接收方在每次发送确认信息ACK的时候携带一个
每个主机会把不同的进程绑定到不同的端口上。
通常会把经常使用的应用程序日志或者日期服务httpft
应用绑定到固定的端口上。
这些应用程序提供的服务之后可以通过这些端口地址访问。
为每个数据流建立和维护相关的状态信息。
Socket、字节序列号、窗口大小还有其他类似的状态信息统称为连接。
每个连接都被一对
建立一个连接在每个端建立状态信息。
当他们通讯结束后相对应的连接会被中断或者关闭以释放资源让其他进程继续使用。
因为连接可能建立在不可靠的计算机和不可靠的通讯网络上所以基于时钟序号的握手机制可以避免错误地初始化连接。
用户可以为连接设置相关的安全和优先级。
当这些功能没有被显式设置的时候会被设置一些默认值。
互连网络包括通讯网络以及连接到这些网络的主机通讯网络通过网关ip
层面上网关一般就是我们连的路由器链路层或者物理层是指具体的网关设备相互连接。
这里假设通讯网络有可能是本地网络以太网也有可能是大的广域网阿帕网这些通讯网络跨网通讯不管是跨越多个局域网还是跨越多个地区的城域网都是基于分组交换技术。
位于通讯网络不同层次的通讯协议、网关、以及主机共同组成了可以保证进程相互通讯的系统这个系统支持在两个进程端口间的逻辑链路上进行双向的数据传输。
一般指主机和网络之间一次交换的数据。
我们一般不用关心数据包在网络间传输的格式。
主机就是连接到网络的电脑从通讯网络角度来看主机就是数据包的来源地和目的地。
进程就是主机中活跃的元素进程通常的定义就是执行中的程序。
因为一个进程需要区分与其他多个进程之间的通讯所以每个进程都可以申请多个端口。
为上层用户提供了一个可以连接本地网络的接口。
这个网络通讯模块把
数据段打包成数据报文并把这些数据报文路由到目的网络模块或者离本地网络最近的网关。
为了通过本地网络数据段是被包装在本地网络报文local
分组交换程序可能会进行打包、分段、或者其他的一些操作来保证可以通过本地分组物理链路层的数据包到达目的网络模块。
报文包装到下一个本地网络协议包中并路由到目的网络的相关网关网关和网关之间也是一个本地网络连接或者直达目的网络模块比如计算机。
通过下一个本地网络时网关有可能会把网络报文拆分成更小的网络报文下一个本地网络
比较小。
在后面的传输过程中有可能会继续拆分网络报文。
网络报文段数据格式可以方便数据接收方网络模块把网络报文段重新组成一个网络报文。
上述操作模型看着非常简单但是实际上整个过程是非常复杂的。
一个重要的特性就是可以选择服务类型。
服务类型可以指导网关或者网络模块在发送数据包到下一个网络的时候设置合适的参数。
服务类型中就包括一个数据包优先级。
报文也有可能会携带相关安全设置来允许主机或者网关在不同级别的安全环境中运行以便隔离数据包。
有可能会调用其他系统功能比如操作数据结构。
与网络相关的接口被相应的设备驱动网卡模块管理。
TCP
不直接调用网络设备驱动而是调用网络模块网络模块会直接调用相应的设备驱动。
并不会阻碍这种实现方式。
但是在这种实现方式下主机到前端处理机之前的通讯协议必须支持本文档规定的相关功能并且把相应的功能接口提供给上层用户。
的用户提供打开、关闭、获取连接状态的功能。
这些系统调用与用户操作文件进行的系统调用是一样的比如打开文件、读取数据、关闭文件。
TCP/IP
模块进行数据收发的功能。
这些系统调用可以传递地址、服务类型、优先级、安全或者其他控制信息。
-------------------------------
-------------------------------
连接上发送的数据流会可靠、按顺序地到达目的地。
通过递增序列号和反馈机制保证传输的可靠性。
概念上每个字节都会赋予一个序列号。
数据段传输的一段字节数据第一个字节的编码就是这个数据段的编码。
发送出去的数据段也会携带一个确认序列码指示期望的下一个数据段的起始字节序列号。
当
发送数据段的时候会复制一份数据到重发队列中并启动定时器。
当收到对这个数据段的确认时这个数据段会从重发队列中删除。
如果数据段没有收到确认并且定时器超时TCP
模块之间的数据流量流量控制机制被引入。
接收方向发送方报告一个窗口win。
这个窗口表示从接收方收到的最后一个字节开始还能接收的字节数接收方剩余的
地址与端口号连接在一起IP:PORT这两个可以保证全网唯一的连接。
socket。
一个连接可以在两个方向传递数据这个被称为全双工。
socket端口号绑定常用的应用进程。
我们可以假定某些进程拥有某些固定的端口号这些进程只能绑定到那些它们拥有的端口上。
实现进程和端口的绑定规则由使用者自己规定但是现在我们假定用户请求为一个进程绑定一个端口或者可以把一组端口独立的赋予一个进程比如把某些端口的高位为某些数值的一组端口赋予一个给定的进程。
数据结构来记录连接的相关信息。
一个关于代码实现的建议就是把指向
调用表示进程想接收建立连接的请求而不是主动去建立一个连接。
通常被动
21514/mysqld一个对外提供服务的进程如果要为其他未知的进程提供服务就需要一个被动
的接口调用。
之后外部进程就可以向本地进程请求建立连接。
如果这个服务使用的端口号是比较知名的端口号那么请求服务时会比较方便。
一些标准服务都是提前绑定到了比较常见的一些端口上。
比如Telent
处理等服务预留后面三个服务只为了测试使用。
有的端口会提供服务查询功能并且会根据的查询信息在相应的端口上启动新的服务。
预留端口是
协议规范的一部分但是端口与服务的绑定关于超出了本文档的讨论范围。
进程可以打开一个被动的连接等待其他进程向本进程发起建立连接的请求当新连接建立时本进程会收到相关的通知。
两个进程同时发起向对方建立的申请连接依然会正常建立。
在分布式计算情况下每个计算机都是相互独立异步运行这种灵活建立连接的方式很方便地为分布式计算提供支持。
请求有两个规则可以确定本地服务是否会接收外部的连接请求。
第一种情况下本地服务准确指定了可以建立连接的外部地址。
另一种情况是本地服务没有指定可以建立连接的外部地址任何外部连接请求都会被处理。
其他处理规则包括部分匹配限制。
了外部服务地址有的没有指定那么当一个主动建立连接的请求到来的时候指定了外部服务地址的本地服务会优先得到匹配如果匹配的话。
数据结构也会被建立并保存。
本地和外部地址的匹配程度确定何时去初始化一个连接。
当交互的两端同步了各自的初始序列号这个连接便会正确建立。
模块可以缓存用户传过来的数据并以一定的方式发送出去但是如果上层用户指定了
当前进程正在处理数据流可以在数据流之后的某个时刻为某个数据标记为紧急TCP
不规定当收到紧急数据时用户进程如何处理但是标准流程是当收到紧急数据时用户进程应该尽快处理相关数据。
模块提供的服务类型字段和安全选项为每个建立连接的用户提供优先级和安全方面的服务。
并不是所有的
中运行有些可能只在非安全情况下使用或者有些只在一级隔离中运行。
有些
模块必须为每个发送出去的数据段添加安全、隔离区、优先级。
TCP
模块也必须为上层协议或者用户提供可以设置安全级别、隔离区、优先级的接口。
遵循一般健壮性准则对于要做的事情持保守态度外部的东西要保持欢迎的态度。
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
标志被设置确认序列号表示接收方期望收到的下一个数据段开头的字节序号。
连接建立后该序列号一直会被传送。
接收方发送的确认字段中会携带一个数字这个数字表示接收方最后一次成功确认之后还能接收的字节数。
位分组分别进行反码求和运算二进制反码求和是怎样求的_百度知道IP
关于二进制反码求和运算需要说明的一点是先取反后相加与先相加后取反得到的结果是一样的最后把得到的数据进行反码运算获得的
如果最后字节数是奇数为了获得校验码需要在最后添加一个字节这个字节的每位都是
0。
添加的字节不会被发送只是为了计算校验和。
计算校验和的时候会在
位的伪头部。
伪头部包括源地址ipv4、目的地址ipv4、协议、TCP
--------------------------------
--------------------------------
--------------------------------
--------------------------------TCP
这个值与数据段的第一个字节的序列号相加就是紧急数据的起始位置。
这个字段只有在紧急标志位设置了才会被处理。
位的倍数。
所有的选项也会被计算在校验和内。
选项可以从任意自己开始。
选项有两种格式
单字节表示选项类型单字节选项类型、一个字节表示选项长度、实际的选项数据
头部结束位置不相符。
这个表示整个选项列表的结束不是每个选项的结束。
Kind1这个选项一般用在其他选项之间比如用来将某些选项对齐到某个字上。
发送方可能不会使用这种选项接收方应该时刻准备接收没有对齐到字的选项。
---------------------------------
---------------------------------
Length4这个选项表示接收方可以接收的最大数据段这个选项一般会在连接建立时刻指定SYN。
如果没有指定这个字段的值则表示数据段大小不受限制。
操作的具体细节前需要对一些重要的关键词做一些解释。
需要几个变量来维护
TCB。
这些变量包括本地或者对端端口号连接的安全和优先级指向用户发送或者接收数据
缓存的指针指向重发队列和当前发送数据段的指针。
关于发送和接收的序列号的信息也被存储在
----------|----------|----------|----------
----------|----------|----------
本节讨论的常用变量的数据都是从当前数据段中的相关字段中获取的。
数据段优先级值一个连接在一个生命周期会经历很多状态。
这些状态包括
|-----------------------------------------------|
连接发送的每个字节都有一个序列号这是设计中比较基础的概念。
因为每个字节都编号了所以可以对每个字节进行确认。
确认机制具有累计的效果比如
1。
因为序列号空间是有限的所以所有处理序列号的算法都应该进行对
来回循环往复。
计算模运算的时候会有一些细微差距所以在比较这些序列号时必须格外小心。
“”
确定那些对发送出去的数据进行确认的序列号。
确定一个数据段包含的所有序列号都已经被确认从重发队列里删除数据段。
确定接收的数据段包含接收方期望的序列号。
比如数据段与接收窗口重叠
发出去数据后会收到对应的确认。
以下几个比较运算被用来处理确认。
处于重发队列中的数据段如果它的序列号和长度小于或者等于接收的数据段的确认序列号那么这个数据段整个的被确认了。
期望接收的下一个数据段的序列号是接收窗口的左边沿或者窗口最左边。
接收方期望接收的数据段的最后一个序列号或者是接收窗口的最大序列号或者右边延。
第一个检查是判断数据段开始字节的序列号是否落入接收窗口中第二个检查是判断数据段最后一个字节是否也落入接收窗口中。
只要通过一个检查就被认为数据段有数据可以放入接收窗口中。
-------------------------------------------
我们使用编号方法同样也保护了某些控制信息。
隐式地为某些控制信息编号可以对这些控制信息进行重发和确认防止出现混乱可以防止对一个控制信息进行多次处理。
控制信息不会占用数据段的数据部分空间。
所以我们必须有规则地为控制信息进行隐式编码。
SYN
是需要隐式编号的两个控制信息并且这两个控制信息只用在连接建立和拆除过程。
为了编码目的SYN
的编号是在它所处的数据段中最后一个字节数据的编号之后。
SEG.LEN
确定。
连接的新实例被称为连接实体。
那么有问题就是连接如何确定从上一个连接实体发送过来的重复数据段。
当连接关闭并且被快速的重新打开时或者由于系统内存不足造成的连接断开然后重新建立时这种问题更为明显。
为了避免冲突当之前连接实体发送的数据段还在网络上传输时新的连接实体应该避免使用相同的序列号。
即使
宕机或者丢失了所有关于之前使用的序列号的信息我们也要保证不出现冲突。
当一个新的连接实体建立时一个初始序列号ISN选择器会用来选择一个新的
每一个连接都有一个接收序列号和发送序列号。
发送初始序列号由发送数据的
标志和初始序列号的数据段来实现。
所以为了实现上述目的一般需要一个初始化序列号选择器并且需要一些握手机制来同步初始化序列号。
同步机制需要发送自己的初始化序列号给对方并且接收对方发送过来的确认信息。
连接的两端必须接收对方发送过来的初始序列号并且发回确认信息。
三次握手步骤是必须的因为序列号不是在网络空间中全局同步的并且每个
数据包除非接收方一直保存之前连接使用的最后一个序列号不是一直都可以记录的。
所以一般接收方需要发送方来检验这个
时间段并且在这个时间段内不创建新的包含序列号的数据段因为这个序列号可能会与网络上传输的老旧数据段的序列号重复。
本规范中
重新初始化并且保留了之前的字节序号状态这时不需要保持静默但是必须保证后续的字节序号要比之前的大。
注如果不存在宕机或者重启等情况TCP
如果在一个主机组成的计算机网络系统中主机突然宕机了并且没有保存所有处于活跃状态Closed
以外的其他状态的连接的相关状态信息的情况下主机重启后需要等待约定的一段时间MSL才能开始重新建立连接。
以下段落会继续介绍该概念。
在网络系统中可以冒着上个连接的数据被新连接接收或者新数据被当做重复数据丢掉的风险不去等待一段时间。
数据包每次从产生到发送到网络中时都会消耗一定的序号空间。
TCP
中的重复判断和序号计算算法都依赖于数据段唯一绑定到序列号空间中并且在网络传输的数据段被确认之前以及这些数据段的副本在从网络中清除掉之前后续发送的数据序列号不能循环超过
2^32。
如果没有这个规定可以想象两个不同的数据段有可能会被赋予相同的序列号或者交叉的序列号导致接收方没办法区分哪个是新的数据包哪个是老的数据包。
数据段包含的字节越多该数据段占用的序列号空间就越多。
跟踪发送下一个字节的序号并且保存需要确认的最早的那个序号这样可以防止
错误使用之前被使用过并且得到确认的序列号再次被使用。
这种方式不能保证旧的重复数据从网络上剔除所以序列空间被设置非常大来减少因为网络中传输的老重复数据段导致数据传输的问题。
在每秒
的序号空间。
数据段在网络中的最大存在周期一般不会超过几十秒这被认为对现有的网络有足够的保护空间即使网速到了
模块没有记录上次使用的序列号那么基本的重复判断和序号算法将会失效。
比如当一个
0经过宕机然后重启之后连接有可能会重新创建之前的连接实例这个时候的连接有可能处于半打开状态这个链接实例发送的数据序列号有可能与之前连接实例发送的并且在网络中传输中的数据序列号相等或者有重叠。
在不了解一个指定的连接之前的序号的情况下TCP
即使主机能记住时间并且可以根据时间选择初始序列号依然不能免于上述问题。
注前面几句话和后面没联系故删除现在假设突然宕机了然后恢复然后建立了该连接的另个一新的实例实例的初始化序号是
(t)上一个连接实例使用的最后一个字节序列。
如果恢复得非常快上一个连接实例发送的在
现在问题是重启后的主机不知道宕机了多久也不知道网络上是否还有上一个连接实例发送的老数据包。
解决这种问题的办法就是在从宕机中恢复过来后在发送数据前静默一段时间。
如果主机不担心两个连接实例发送的新老数据包可能造成数据问题的话可以在发送数据前不用等待一段时间。
TCP
实现应该为用户提供在宕机重启后是否选择等待这一选项或者为用户提示性的为所有连接实现静默等待。
然而在启动后至少保持
最后总结每一个发送出去的数据段占用一个或者多个序列号一个数据段发送之后数据段的序列号处于使用或者繁忙状态中直到
时间过去当遇到宕机时连接发送的最后一段数据段会占用一段序列号空间如果很快地建立了一个新的连接实例并且使用了上一个连接实例使用的数据序列的话那么将会在接收端造成数据错乱的问题。
三次握手是建立连接的一个过程。
这个过程一般是由一端发起然后由另一端响应。
当两端同时发起连接请求时三次握手也同样适用。
当同时发起连接建立请求时发送方发出去
数据段。
对于接收方来说有可能会在处于同时建立连接状态时又收到一个老旧的
以下有几个建立连接的实例。
尽管这几个实例没有使用带有用户数据的数据段来做连接同步操作TCP
也需要确保在能保证接收缓冲的数据都是有效的时候才会把数据传递到上层应用只有把数据缓冲到连接建立阶段数据才是有效的。
三次握手可以减少假连接的发生概率。
这是协议实现在内存和消息检验之间做的权衡。
最简单的三次握手过程如下图。
图的具体解释如下。
每行都有序号为了方便引用描述。
右箭头表示
状态表示离开或者接收到某些数据段中间横线表示数据段的内容之后触发的。
数据段同时带有序列号、控制字段、ACK
字段。
为了明确起见其余的字段比如窗口大小、地址、长度、文本什么的没有描述出来。
8.使用三次握手的主要原因是可以防止上一个连接实例发送的老旧的连接建立标志会对现在进行的连接初始化造成影响。
为了防止这种老旧包对当前连接建立造成影响引入了
TIME-WAIT他会拆除当前连接并且通知上层连接用户java
异常。
我们接下来讨论当连接处于半打开情况下出现这种异常的场景。
简单描述了从重复老旧包中恢复的过程。
第三行之前连接实例的老包到达了
半打开连接和其他异常状态状态的连接连接的一端已经关闭连接并且没有通知对方或者由于突然宕机导致连接的一端关于
状态的记录都丢失这种连接被称为半打开连接。
如果它试图向对方发送数据这种连接会被重置。
试图重新建立连接或者在他认为已经建立的连接上发送数据。
在第二种情况下他会收到
通常情况下如果收到一个不属于本连接实例的数据段的话都要产生并发送重置控制包。
如果不确定这个包是不是这个连接的不能发送重置控制包。
控制包之外的其他数据包发送过来时都应该向对端发送一个重置控制包。
特别的如果
模块建立连接也应该通过发送重置控制包通知对方。
如果接收到的数据段有
与数据段长度的和。
最后连接还是保持关闭状态。
如果连接处于非同步状态LISTEN,SYN-SENT,SYN-RECEIVED收到了未曾发送过的数据段的确认信息或者收到的数据段的安全等级、隔离级别与当前连接要求的不符合接收端将会向发送端发送一个重置消息。
如果我们发送的
还没有得到确认同时打开的情况下并且收到的数据段的优先级比本地的优先级高那我们要么升级如果用户或者系统允许的话这里
控制包到对端或者如果接收的数据包的优先级比本地端要求的低我们会继续处理如果发送方不能把自己的优先级提升到与我们本地一样的优先级的话连接会被关闭这个是通过后续的数据段来检测到的。
如果我们的
已经被确认了那么接收到的数据包的优先级必须与我们本地的优先级一样否则会向对端发送
与数据段长度的和。
最后连接还是保持关闭状态。
如果连接已经处于同步状态ESTABLISHED,
TIME-WAIT并且收到不可接收的数据段超过接收窗口大小或者不可接收的确认
保持现有状态。
如果数据包包括安全级别、隔离、优先级但是不满足本地连接对安全级别、隔离、优先级的要求本地会关闭连接并进入到关闭状态并发送
包之后先检查是不是正常的在接收窗口内如果是正常的然后改变状态。
如果连接处于
操作意味着我没有数据需要发送了。
对于全双工的连接来说CLOSE
操作的一端仍然可以继续读取数据除非对端也停止发送数据。
所以一个程序可以发送多个
close然后等待对面发送数据过来直到对面停止发送数据。
当对面没有数据发送的时候我们可以通知用户让用户可以优雅的关闭连接。
TCP
在连接关闭前会可靠地把数据分发出去如果一个用户不需要新数据了那么他可以监听连接直到收到对面关闭连接的通知-1这样可以确保自己发送的数据对面都已经接收到了。
用户发送完数据并且关闭连接后需要一直读取连接传递上来的数据直到收到连接关闭的通知-1。
会一直重试发送直到收到确认。
当连接对端收到所有数据并且为刚才发送的
两个端口必须有相同的隔离级别和安全才能建立连接并且连接的优先级要高于或者等于两个端口的优先级。
隔离连接请求发送过来或者优先级比较低应该拒绝这个连接请求。
应该在发送
时给发送方一个提升自己优先级的机会发现连接请求的优先级还是低的时候需要拒绝这个链接。
使用默认的安全配置在接收到数据包时仍然需要检查数据包的优先级并且在必要的时候需要试着提升自己的优先级。
即使是在非安全环境中安全参数也有可能会使用值可能表示数据是不需要加密的所以当非安全环境中的主机
模块收到用户的安全参数时仍然需要接收这些参数但是不需要把这些参数发送出去。
连接一旦建立数据就可以通过数据段的方式在连接上传递。
因为数据段有可能会丢失或者有可能会校验出错或者网络拥塞TCP
通过重发机制超时保证每个数据段都可以可靠传递。
因为网络问题或者重传机制重复的数据段有可能会被接收到。
在序列号章节已经讨论过TCP
通过对接收数据段的序列号和确认序列号进行测试来确定接收的数据段是不是可以接收的。
变量跟踪最久发送的但是没有收到确认的序列号。
如果数据通道短暂的空闲并且发送出去的数据都得到确认了上述三个变量应该是相等的。
变量的值。
这三个值的差值可以看作是对通讯延迟的一个基本衡量。
这三个变量的变化量是发送数据段的长度。
注意连接建立状态下所有的数据段都应该包含当前的确认信息。
的用户之多导致超时时间需要动态的确认。
下面介绍一种计算超时时间的方法。
从发送一个带有序列号的字节出去到收到对这个字节序列的确认信息确认包确认的序列号不必与发送数据的序列号相等的时间叫做
紧急机制可以允许发送方让接收方接收某些紧急数据并且允许接收方确定什么时候把紧急数据都接收完成紧急数据边界。
这个机制允许在数据流中放一个指针来表示紧急数据的结尾。
当前数据段如果有紧急指针并且有紧急标志那么
通知用户进入紧急模式。
当用户处于紧急模式时紧急指针被更新了用户是不会被通知的。
必须把紧急指针字段的值与当前段序列号相加获得紧急指针的具体值。
如果没有紧急标志的话表明当前段没有紧急数据。
窗口是发送方用来表明它还可以接收的数据序列号范围。
这个窗口基本就可以认为是接收方的接收缓存大小。
大的窗口可以加快数据传输。
如果传送过来的数据多于窗口大小多余的数据会被丢弃。
这会导致不必要的数据重传增大网络负荷。
过小的窗口会产生更多的传输时延。
这个机制允许一开始使用大的窗口随后如果没有更多缓存空间的话可以慢慢减小窗口尺寸。
这被称作窗口缩小。
可靠性规则制定TCP
发送模块在收到用户传过来的数据后也要发送最少一个字节。
即使接收窗口为
时定时发送数据会把接收方重新打开的窗口通知到发送方这样是很有必要的。
时如果收到了数据也应该返回一个回馈来表示下一个期望收到的字节序列号。
把需要发送的数据打包成窗口大小在重新发送队列中有可能会重新打包。
这种重新打包不是必须的但是也许很有帮助。
在一个单向的数据流连接中确认信息中有相关窗口大小这个确认信息使用相同的序列号这样在多个确认包乱序到达时
没办法对这些确认包进行重新排序。
这不是很严重的问题但是这样会导致窗口会根据老确认包中的窗口大小来发送数据。
这个问题的改善方法就是对于收到接收方的确认包中他确认的序列号必须比上一次处理的确认序列号大发送方才会调整发送窗口。
过小的窗口会让数据通过很小的数据段发送如果网络性能提高可以稍微增大窗口的大小。
接收方可以延迟更新窗口大小当窗口大小可以达到最大窗口大小的一定比例后再更新比例有可能是
40%。
对于发送方的一个建议就是为了防止发送小数据包可以等窗口到达一定大小后再发送数据。
当用户调用
应该立即发送数据不管是多小的包。
确认包不应该被延迟发送否则对端会因超时重新发送数据。
当收到小数据包发送确认包时不更新窗口大小等到窗口变大时再通过确认信息更新窗口大小。
探测接收方窗口大小的数据包有可能会被截断成更小的数据包。
如果一个字节的数据包被接收方接收了那么这个字节会占用刚开始释放的窗口的一个字节的空间。
当窗口不在是
时发送方尽可能发送多的数据出去那么这个数据有可能会被打包成很多大的或者小的数据包。
随着时间推移接收方会短暂停止分配更多的窗口空间导致大的数据包会被切分成更小的数据包。
时间久了数据会通过很多小数据包来传输。
到底层协议之间的接口这里没有表述因为这个是需要底层协议进行定义。
这里底层协议就是
函数都是虚构的因为每个操作系统的实现都不尽相同。
所以我们必须提示读者每个
接口。
每个接口的名字和大多数高级语言中的函数方法名字一样这种命名方法并不是排除一些自陷类型的服务调用比如
用于支持通讯所需的最基本的操作。
不同的实现可能定义不同的方法格式并且它们有可能会合并一些基础方法为一个方法或者把一些基础方法分解成多个方法。
特别的用户可能希望当他们在对一个连接进行第一次的
实现不能只接收用户请求也同时给它服务的进程返回相关信息。
相关信息包括
方法来等待连接。
被动连接有可能会指定特定的外部主机地址来等待特定主机的连接或者不指定主机地址可以接收所有的主机发起连接的请求。
指定了特定远端主机的连接通过
或者操作系统的某些组件会检查用户是否有权限设置打开一个指定了优先级或者安全
中的中优先级之间最大的那个值并且这个优先级在之后的连接生命周期中一直固定不变。
TCP
实现也许允许用户控制优先级协商。
比如用户可以指定只能优先级相等或者在提升优先级等级时必须得到用户的确认。
这个调用会把用户指定缓存中的数据通过指定的连接发送出去未必真的发送。
如果连接没有打开SEND
命令然后自动打开连接。
如果用户进程没有使用这个连接的权限则会报错。
标志被设置了数据会马上传送到接收方并且在创建的最后的数据段中会设置
紧急标志设置了发送到目的地的数据段都会设置紧急指针字段值。
如果紧急指针之前的紧急数据都没有被用户进程处理的话TCP
会把紧急条件报告给用户进程。
紧急标志就是为了让接收方尽快处理相关数据同时也可以标记什么时候紧急数据都被接收方收到了。
发送方指定的紧急数据的次数与接收方收到的紧急数据通知的次数可能不一样。
会一直阻塞直到数据发送完成或者超时。
但是这种简单实现会导致死锁比如连接两端都发送数据而不接收数据并且性能也不高所以不推荐。
稍微复杂的实现会让
模块会通过信号或者模拟中断来通知用户进程。
一个可选的实现就是立即返回一个响应给调用进程。
比如SEND
接收到。
我们可以乐观的认为最终会成功。
如果我们错了连接会因为超时断开。
在这种同步的调用实现中也会有一些信号通知只不过这些通知但是这些通知是与连接相关的并不是关于数据收发的。
调用都应该返回对应的响应状态码与存放接收数据缓存的内存地址。
TCP
到用户的接口会在下文讨论主要讨论函数调动应该返回什么的信息给用户进程。
这个命令会为相关连接分配一个接收数据的缓存。
如果在这个命令前没有执行
在最简单的实现里调用这个函数的进程会一直阻塞直到接收缓存进程传递的缓存不是
的接收缓存填满或者某些异常出现但是这种实现方式会导致死锁。
复杂的实现版本允许多个
的接收缓存会在数据段到达时被填充。
精心设计的系统有可能是异步系统可以在收到
会返回接收到的所有紧急数据并且用户进程进入正常模式。
需要注意的是紧急数据不能与非紧急数据处于同一个
调用同时也考虑有些接收缓存不会被填满在调用返回时会跟着一个接收缓存的地址以及读取的字节数量。
这个命令会将指定的连接关闭。
如果连接没有打开或者进程没有相关权限异常会被返回。
关闭命令是一个优雅的操作当多个
命令发送的数据在传输中或者重传并且流量控制允许这些数据会在成功发送到对面后连接才会关闭。
所以可以在多个
命令这样也会保证发送的数据会到达目的地。
需要注意的是即使连接处于半关闭状态但是进程仍然可以通过
命令是我不想发送数据了但是不代表我不想接收数据了。
在超时前关闭连接的一方有可能不能抛弃剩余的数据。
在这种场景下
因为关闭连接需要与对端进行通讯所以关闭连接的一方会短暂地以处于
socket本地连接名称接收窗口发送窗口连接状态等待确认的缓存数量等待接收的缓存数量紧急状态优先级安全
根据连接状态以及实现某些字段可能没有或者没有任何意义。
如果进程没有权限调用这个命令则会返回一个异常这样会防止没有授权的进程获取相关连接的状态。
消息。
根据实现的不同用户进程可能会收到每个发送或者接收数据块的删除通知或者只会收到一个
通知用户进程时相关数据会传递给用户进程。
本协议一般指异常消息。
在其他情况下有可能会通知关于
实际上通过调用底层的协议模块来在网络上实现发送和接收数据。
一个例子就是
分钟。
我们明确如果数据在一分钟内不能分发出去便把这个数据段丢弃。
提供的接口必须提供可以操作此类信息的接口。
这个功能非常重要这样
就可以获取源地址与目的地地址来计算校验和头部的伪地址。
这个也可以保留请求的返回路由信息。
这个章节描述的处理过程只是一个可能实现的示例。
其他的实现可能有不同的处理序列但是他们同本章描述的只有细微的差别而不应该有很大的实质性的差别。
的活动可以简单描述成对事件的响应。
事件可以被分成三类用户调用、数据段到达和超时。
本章描述
接口模型是指用户命令会立即返回并且延迟一段时间后会得到相应结果。
在下文‘signal’是指延迟获得结果。
异常响应被描述为一段字符串。
比如用户引用了不存在的连接会得到error:connection
处理到达数据包的第一步就是检验序列号比如数据段中的序列号位于接收窗口中然后被放入队列中然后通过序列号排序。
如果我们收到的数据段与之前已经收到的数据段有一部分重叠那么我们重新构造这个数据段只包含新的数据然后重新组织头部信息来保持一致。
命令设置了紧急标志那么这个标志必须与数据包一起发送出去。
如果没有内存空间来缓存发送的数据返回
命令设置了紧急标志那么这个标志必须与数据包一起发送出去。
如果没有内存空间来缓存发送的数据返回
把数据打包成数据段并且把确认信息、希望收到的下一个数据段序列号一并发送出去。
如果没有足够的内存空间返回
的接收缓存返回给用户。
如果在传递给用户数据的前面有紧急数据那么通知用户进程。
如果
必须给数据发送者一个确认信息。
在下面的处理数据段来介绍具体的确认格式。
SEQ0ACKSEG.SEQSEG.LENCTLRST,ACK
SEG.SEQ其他控制信息和数据应该被缓存起来等待后续处理。
选择一个
标志都应该有反馈信息收到反馈信息的数据会被丢弃发送方丢弃。
一个
包可能是非法的因为这个数据包并不是之前发送过的任何数据的响应信息。
程序流程一般到不了这里如果走到这里直接把数据删除。
SEQ0ACKSEG.SEQSEG.LENCTLRST,ACK
SEQ0ACKSEG.SEQSEG.LENCTLRST,ACK
数据段按序列号顺序处理。
数据段的初步判断主要用来去除重复的数据然后按照
顺序处理。
如果一个数据段既有老数据又有新数据那么新数据会得到处理。
-------------------------------------------
被设置了接收方就不用返回确认信息了之后丢弃收到的数据段并返回。
RCV.NXT没有超过接收方的窗口大小。
有可能会把多余窗口的数据段剪裁成一个新的数据段包括
refused”然后拒绝建立连接。
上述两种情况都会把重发队列中的数据清空在主动打开情况下进入
这个检查放在序列号检查之后为了防止上一个连接实例的数据段导致现在连接被关闭。
控制包不在窗口中流程不应该能走到这里。
序列号确认那个流程中应该会返回确认信息。
SEG.ACK。
重发队列中的被确认的数据都可以删除。
用户应该收到正数的确认序号所有发送的数据都被完全确认同步情况下SEND
SND.UNA直接忽略。
如果确认了没有发送过的数据直接把数据包丢弃返回因为是同步状态这种情况下直接丢弃就行但是非同步状态下就需要特殊处理了。
(RCV.UP,SEG.UP)并且通知用户对端有紧急数据需要处理。
如果用户已经在紧急模式中不用重复通知用户。
缓冲中。
数据段可以分配到用户缓冲中直到用户缓冲满了或者数据段没数据了。
如果数据段是空的但是有
这个确认标识应该和数据包一起发送但是延迟时间应该控制在合理的范围内。
有相同的作用把所有已经接收但是还没分发到用户进程的数据分发到用户进程。
不管连接处于什么状态用户指定的超时时间超时清空所有队列中的数据通知用户进程
不管连接处于什么状态重发队列中的某个数据段超时直接把数据段前移到队列前端重启定时器。
表示确认序号字段有效。
PSH该字段置一表示接收方应该尽快将这个报文段交给应用层。
RST重新建立
时紧急指针才有效紧急指针是一个正的偏移量和序号字段中的值相加表示紧急数据最后一个字节的序号。
Optionsvariable选项字段
list.0x01-No-Operation.0x024Maximum
端最大可接收报文的大小。
这个字段只能在初始连接请求时发送即在发送
连接进程在生命周期会经历一系列的状态变化。
这些状态是LISTEN,
连接请求。
SYN-SENT表示已经发送了一个连接请求后等待一个匹配连接请求。
SYN-RECEIVED表示在接收和发送连接请求后等待一个确认连接请求
ACK。
ESTABLISHED表示已经建立连接接收到的数据可以传递给用户。
这个是数据传输阶段的正常状态。
FIN-WAIT-1表示等待来自远程
的连接终止请求或对先前发送的连接终止请求的确认。
FIN-WAIT-2表示等待来自远程
的连接终止请求。
CLOSE-WAIT表示等待本地用户的连接终止请求。
CLOSING表示等待来自远程
发起连接、传输数据和断开连接这个三个过程所经历的状态。
如下图此图相当于上面的总图分解
https://blog.csdn.net/aigoogle/article/details/121036557
https://blog.csdn.net/ZHONGCAI0901/article/details/109436851
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback