最后更新:2022-06-19 03:03:59 手机定位技术交流文章
目录
传输层端口代码,多路径重用,多路径分解
1.1,运输层端口编号
端口号的基本概念
TCP/IP系统应用层通用协议中使用的知识端口代码
1.2.多路径重用和多路径分解运输层
编辑面向连接的运输:TCP
2.1TCP连接
2.2TCP和UDP协议的比较
2.3TCP报告表格
2.4TCP三手(创建连接)
2.4.1TCP为了确保连接的可靠性,每次通过三个握手建立一个可靠的连接
2.4.2使用tcpdump命令获取构建过程
可以握手两次吗(面试问题)
2.5TCP四波(免费连接)
2.5.1TCP使用四个哨声去切断;编辑
2.5.2使用tcpdump命令抓取以查看分离过程
2.5.3时间等待时间有太多的时间,为什么?(面试问题)
2.5.在 TIME_WAIT状态中,是否可以强制使用由连接所占用的插座地址?这是怎样实现的?(面试)
2.6TCP连接SYN洪水攻击
现场计时器2.7TCP功能
2.8显示TCP建立与切断状态图
2.8TCP流量控制
2.9TCP拥堵控制
2.9.以三种方式解释交通堵塞的原因和交通堵塞成本(书中解释);
2.9.2拥堵控制方法
它开始缓慢,避免拥挤
2.9.4快速重传和快速恢复
2.10TCP超时再传输的时间选择
2.10.超时转播的极端情况
2.10.1往返时间估计数及加班费
2.11TCP总结
TCP端口编程(c++实现代码)
TCP编程流程
客户端
服务器端
参考文献
在网络编程中,我们经常能听到端口数的概念,TCP协议是例外,那么端口数是什么?
举个简单的例子:如果IP用于定位街道,然后港口是每个街道的门的数目.在通讯过程中,数据通过各种通信协议进入设备(例如计算机)后,这里的设备相当于一条街区,还有许多程序在设备计算机内运行,数据进来之后,你必须给它相应的门号(即港口号),这 是 促进 后续 行动 的 程序 。端口号是传输协议的一部分,因此我们可以说,数据通过IP地址向指定设备发送相应的数据,数据通过端口号码发送到指定的服务或程序。
TCP/IP系统的传输层使用端口编号来区分应用程序层中的不同的应用程序进程。
端口号使用16位元,所以值范围为0~65535;
port 号 按 范围 划分 为 三 类, 如下 :
| 协议及服务器 | 端口号 |
HTTP |
80/8080/3128/8081/9098 |
| HTTPS | 443/tcp 443/udp |
| SOCKS代理协议服务器 | 1080 |
| .FTP协议 | 21 |
| 特尔网协议 | 23 |
| FTP | 21/tcp |
| TFTP | 69/udp |
| SSH(安全登录),SCP(文件传输) | 22/tcp |
| SMTP | 25/tcp |
| POP3(E-mail) | 110/tcp |
| Webshpere应用程序 | 9080 |
| webshpere管理工具 | 9090 |
| JBOSS | 8080 |
| TOMCAT | 8080 |
| 赢得2003年远程登录 | 3389 |
| MS SQL*SERVER数据库服务器 | 1433/tcp 1433/udp |
| MS SQL*SERVER数据库监控器 | 1434/tcp 1434/udp |
| DNS | 53/udp |
| Mysql数据库 | 3306 |
| BGP | 179 |
为了解释分解和复制的过程,这里是一个简单的例子:
家庭中的每一个孩子都以他们的名字标识。假设安的家人寄给比尔一封信;当比尔从邮局收到一包信时,然后检查收件人的名字,把信交给他的兄弟姐妹,他所进行的手术是解体;安娜从她的兄弟姐妹那里拿来手机短信,交给邮政员时,她所进行的操作是多路径复制;
给出了多路径复制和多路径分解的概念:
如图所示,多路径重用和分解的过程是:

TCP称为连接导向(connection-oriented),这是因为在一个应用程序进程开始向另一个应用程序进程发送数据之前,这两个过程必须先握手.也就是说,他们必须互相发送一些筹备声明,建立参数以确保数据传输。作为TCP连接的组成部分,连接的两边都启动许多与TCP连接相关的TCP状态变量。

TCP为每个客户端数据设置一个TCP头条,这会创建多个TCP段。这些段落被传递到网络层中,网络层将它单独封入网络层IP数据消息中.然后这些IP数据消息被发送到网络上。当TCP在另一端接收消息段时,消息段的数据将放在TCP连接接收缓存中,如上图所示。应用程序从缓存中读取数据流.每个连接端都有自己的发送和接收缓存。
下图可以帮助记忆:

TCP消息部分由第一个字段和一个数据字段组成。数据字段包含应用程序数据。MSS限制消息字段数据字段的最大长度。当TCP发送一个大的文件时,例如,在网页上的图片,TCP通常是将文件的增长率分成多个MSS块(除了最后一个,它通常比MSS更小。然而,交互式应用程序通常传输比MSS小的数据块。例如,对于像Telnet这样的远程登录应用程序,其TCP消息字段的数据字段通常只有一个字节。因为TCP的标题通常是20字节(比UDP的标题多12字节),因此,Telnet发送的消息段可能只有21字节长。
下面的图示了TCP消息段的结构:
最后一个序列被添加后,下一个序列返回0。TCP消息字段数据负载的第一个字母序列。
在确认数加到最后一个后, 下一个确认数返回0.
它指示了从另一方的下一个TCP消息中预期接收的数据负载的第一个字节的序列,以及所有先前接收的数据的确认。 如果数值=n被确认,它表示到n-1序列的所有数据已经被正确接收,并期望接收n序列的数据。

在Ubuntu下使用命令tcpdump,您可以抓取并观察TCP连接的建立和关闭。命令需要管理员的特权,格式如下 ( 假设测试的两个主机的IP地址是和 ) :

不可以
假设客户端向服务器发送请求建立连接(SYN声明),然而,由于某些原因,它未能及时到达服务器端;基于TCP协议的加班重传输机制,客户端发送第二个SYN消息,以建立连接,服务器收到之后,确认向客户端发送的SYN消息段,上述三个握手的第二步;我们完成连接(两个握手)并发送数据等,直到连接关闭;在关闭状态的服务器收到客户端发送的第一SYN消息(建立连接),服务器响应它(进入已建立的连接阶段),但客户端是关闭的(服务器不知道),所以服务器端继续传递预期从客户端接收的数据;该过程在图中显示:



答案是不多多余;
如图,假设时间等待被取消,当客户端发送确认消息时,因为没有时间等待,如果客户端发送的确认消息丢失,则该客户端将直接关闭。如图所示,然后服务器将等待客户端的确认消息,进行不停的重传,一直无法关闭;

是的;服务器程序可以通过设置索克选项SO_REUSEADDR来强制在 TIME_WAIT状态中使用由连接占用的索克地址。
正如我们在讨论TCP的三个握手时所看到的那样,服务器分配和初始化连接变量和缓存以响应接收的SYN。然后服务器发送一个SYNACK来响应,然后等待顾客的ACK消息.如果客户不发送ACK完成三个握手的第三步,最终(通常在超过一个小时后)服务器终止半开连接并恢复资源。该TCP连接管理协议为经典的DoS攻击提供了环境,即SYN洪水攻击。在这种攻击中,攻击者发送大量TCPSYN消息,没有完成震动的第三步。随着SYN的报道不断,服务器不断分配资源(但从未使用)到这些半开放的连接中,这使得服务器的连接资源耗尽。这个SYN洪灾攻击是许多报告的DoS攻击中第一个(CERTSYN 1996)。幸运的是,现在有一个有效的防御系统,叫SYN cookie [ RFC 4987 ],它们被部署在大多数主流操作系统中。SYN的cookie工作如下:

如图所示,TCP服务器如何检测一个TCP客户端故障?
使用保活计时器;

客户端TCP在启动时处于CLOSED(关闭)状态。客户端应用程序启动新的TCP连接.这使得客户端的TCP向服务器的TCP发送SYN消息。发送SYN声明后,客户端TCP输入了SYN_SENT状态。当客户端TCP处于SYN_SENT状态时,它等待从TCP服务器确认客户端消息字段,SYN位作为一个消息字段。收到 这种 声明 后,客户端进入“建立”状态。处于停滞状态时,TCP客户端可以发送和接收包含有效的负载数据的TCP消息段(即由应用程序层生成的数据)。
假设客户端应用程序决定关闭连接。(请注意,服务器也可以选择关闭连接。这使得客户端TCP发送一个TCP消息,其 FIN位数设置为1,然后输入Fin_WAIT_1状态。在 FIN_WAIT1状态时,客户端TCP等待由服务器确认的TCP消息。当 收到 报告 的 一段 时,客户端TCP输入Fin_WAIT2状态。在 FIN_WAIT 2 状态时,等待服务器 FIN 位的客户端被放置在另一个报告段的1;收到该报告段后,客户端TCP确认服务器的消息部分,然后输入时间等待状态。假定ACK丢失,TIME_WAIT状态返回最终确认消息给TCP客户端。在Time_Wait状态中花费的时间与具体实现有关,典型的值为30秒、1分钟或2分钟。经过等待后,连接就正式关闭,所有客户端资源(包括端口号码)将被释放。
我们知道,TCP连接的每个主机都为该连接设置接收缓存.当TCP连接接收正确的、有序的部门时,它将数据输入接收缓冲器。应用程序进程将从缓存中读取数据事实上,接收机应用程序可能忙于其他任务,读取数据可能需要很长时间。如果应用程序读取数据相对缓慢,发送者发送过多,过快,发送的数据很容易溢出连接的接收缓存。
因此TCP向其应用程序提供一个流量控制服务,以消除发送者造成接收者缓存过流的可能性。 因此,交通控制是一个速度匹配服务,即发送者的发送速度与接收者的应用程序的读速度相匹配。 TCP发送器也可能受到IP网络的拥堵;这种形式的发送器控制被称为拥堵控制,虽然交通控制和拥堵控制的行动非常相似(与发送器的拥堵),但它们显然是完全不同的原因采取的措施。
TCP通过允许发送者维护一个叫做接收窗口的变量来提供流量控制。通俗地说,接收窗口用于给发送者指示接收机有多少缓存空间。因为TCP是完全双重通信,两端的发送者都保持一个接收窗口。在文件传输中,我们研究接收窗口.假设主机A通过TCP连接向主机B发送一个大的文件。主机B将接收缓冲器分配给连接,并使用RevBuffer来表示它的大小。主机B上的应用程序过程从时到时从缓存中读取数据。我们定义以下变量:
由于TCP不允许分配的缓存溢出,必须建立以下公式:

接收窗口由rwnd表示,它根据可用缓冲空间的数量设置:
![rwnd=RcvBuffer-[LastByteRcvd-LastByteRead]](http://static.wangsu123.cn/article/image/20220619/dc5a1051a4164f294bcb676412902bde.png)
由于时间和空间不断变化, rwnd是动态的。
将当前rwnd值放在它发送到A、B主机的消息字段的窗口字段中,通知A主机在连接缓存中可用空间的数量。开始时,主机B设置 rwnd = RcvBuffer.为了实现这点,主机B必须跟踪与连接相关的多个变量主机A旋转跟踪两个变量,LastByteSent和 LastByteAcked,这两个变量的意义是显而易见的。注意两个变量 LastByteSent E LastByteAcked之间的区别,它是A主机发送到连接的数据量,但未被确认。通过控制rwnd内未确定的数据量,这确保A主机不会重载B主机接收缓存。因此,主机A 应 在 连接 的 整个 生命 周期 中 确保 :

那么假设主机B的接收缓冲器已经满了,使得rwnd=0。在宣布rwnd=0给主机A后,假设主机B没有发送给主机A的数据。此时,想想可能发生什么事。因为在主机B上的应用程序进程将空缓冲,TCP 不会发送 host A 的新消息段,其中 rwnd 为新值;事实上,TCP只发送消息给A主机,当它有数据或确认发送时。所以主机A不能知道主机B的接收缓冲器有新的空间。即, 主机A被封锁,不能再发送数据!
为了解决这个问题,TCP规范要求: 当主机B的接收窗口为0时,主机A继续发送一个仅发送一个字节的数据消息段。 这些声明将由接收者确认。
如图所示,假设主机A主机B发送以下消息;

根据上文所述,下面的图表显示了一种过程:

情况一:两个发送者和一个路由器,具有无限缓存;
我们假设A主机的应用程序以平均每秒 λn 字节的速度发送数据到连接(例如通过一个接口传递数据到传输层协议)。这些数据是初始数据,这意味着每个数据元素只能一次发送到插座上。下面的运输层协议是简单的.数据被包装和发送;没有错误恢复(如重新传输),流量控制或拥挤控制。忽略增加运输层和下层标题信息所引起的额外费用,在第一 种情况下,主机A-to-router提供每秒 λn 字节的速度的流量。主机B也同样运作,为了简化问题,我们假设它也以每秒 λin 字节的速度发送数据。自动机A组件和主机B组件通过路由器,分段容量通过R的共享产出链传输。该路由器带有缓存,可以用于存储“人类子群”,当一个子群达到输出链的速度超过输出链的容量时。在此第一种情况下,我们假设路由器有无限缓冲空间.
下面的图表在第一个情况下显示了主机A的连接性能。左边的图显示了每个连接的吞吐量(接收器接收的每秒字节数)和连接的传输速率之间的函数关系。当传输速率介于0和R/2之间,接收器的吞吐量等于发送器的速度,也就是说,所有发送者发送的数据在有限的延迟后到达接收者。然而,当传输速率超过R/2时,它的容量只有R/2。这种吞吐能力是由两个连接之间的共享链路容量引起的。链子完全不能在比R/2的稳态速度下向接收器发送子集。不管东道主A和东道主B的传输率有多高,他们不能看到超过R/2的吞吐量。
取得每个R/2连接的吞吐量实际上看起来是个好事情,因为链被充分利用在交付分组到目的地的过程。但是,图b显示了运行速度接近链的容量的后果。当传输速率接近R/2时(从左到右),平均延迟的时间越来越长。当传输速率超过R/2时,路由器中的平均队列子集将无限增长,源和目的地之间的平均延迟也会变成无限的(假设这些连接运行无限长并且有无限的缓存量)。因此,尽管从吞吐量的角度来看,在接近R的总吞吐量下运行可能是理想的状态,但从时延角度看,但它远远没有理想。即使在这种(极端)理想化中,我们发现拥堵网络的成本,也就是说,当分组到达率接近链的容量时,他们遇到了巨大的队列延迟.
情况二:两台发射器和一个路由器,内存有限

现在我们将在两个方面对第1个情况作一些改变。首先,假设路由器的缓存容量有限。现实世界这一假设的结果是,当一个子组到达一个已经完全的缓存时,它就会被丢弃。其次,我们假设每一个连接都是可靠的。如果包含传输层消息段的子集在路由器中被丢弃,然后最终将重新发送给发件人。因为分组可以重新传输,因此,我们现在需要更仔细地使用传输速度的术语。特别是,我们再次表示每秒 λin 字节是应用程序发送初始数据到插座的速度。传输层向网络发送消息的速率(包含初始数据或重传输数据)是使用的:字节/秒。λ有时被称为网络的传波负载。
首先,考虑到一个不真实的情况,也就是说,主机A可以以某种方式(难以想象!)确定路由器中的缓存是否空,因此,仅当缓存是自由时才发送一个子集。在这种情况下,将不会产生丢包,λin等于 λin',并且连接是等于 λin 。这 是 下面 的 图 a 中 描述 的 。从吞吐量的角度看,性能是理想的,即, 每个发送的子组都是收到的.在这方面注意到,平均主机传输速度不能超过R/2,因为假设不会有群体损失。
然后考虑一个更现实的情况,发送者只在被识别为丢失的子集时重新发送。(同样,所作的假设具有一定的灵活性.然而,发送主机可能设置过时时间足够长,让它不可见,以确保未被确认的小组已经丢失。)在这种情况下,性能可能与下图b所示相似。为了了解当时发生的事情,考虑 Supply load λ'in (初始数据传输 plus the total transmission speed) 等于 R/2。根据下图b所示,在这一供应负荷值下,数据发送给接收者应用程序的速度是R/3。因此,在发送的5R单元数据中,从平均的角度说,每秒0.33R字节是初始数据,每秒0.166R字节是重新传输的数据。这里我们可以看到另一个网络拥堵的成本,也就是说,发送者必须执行重新传输,以补偿因缓存溢出而丢弃(丢失)的子集。最后,我们考虑以下情形: 发送者可能提前加班,以及延迟但没有在队列中丢失的转播组。在这种情况下,初始数据子集和重新传输子集可以到达接收机。当然,接收器只需要一个这样的子组的副本,重传分组将被丢弃。在这种情况下,重新传递的路由器的初始子集拷贝是徒劳的,因为接收者已经收到分组的初始版本。路由器可以利用链路的传输能力发送另一个子集。这里,我们还看到网络拥挤的另一个成本,也就是说,在发送者大量延迟的情况下,不必要重新传输将导致路由器使用其链带宽传输不必要子集拷贝。图c显示,如果每个子集被路由器传送(平均)两次,吞吐量和供电负荷的比较.因为每个分组被发送两次,当其供电负荷接近R/2时,其密度将逐渐接近R/4。

情况三:四台传送器和多个路由器具有有限的缓存和多个跳跃路径
有四个主机发送分组,每一条通过双重叠叠的跳跃路径传送,如图所示。再次,我们假设每个主机使用过时/重传输机制来提供可靠的数据传输服务。所有主机都具有相同的 λ 值,所有路由器的链路容量为每秒R字节。我们考虑从主机A到主机C的连接,连接通过R1和R2路由器。A-C连接和D-B连接共享路由器R1,它也连接到B-D共享路由器R2.对极小的λ值,路由器缓存的溢出是罕见的(如拥挤情况1和拥挤情况2),吞吐量大致等于供电负荷.对于稍大的 λ 值,相应的吞吐量也较大,因为更多的初始数据被发送到网络并交付到目的地,溢出仍然很少。因此,对于较小的λ日,λin的增加会导致 λout的增加。
在考虑非常小流量的情况后,下面是对 λin ( 因此 λin' ) 大时的情况的分析。考虑路由器R2。不管 λm 的值有多大,向路由器R2(路由器R1继电器后向路由器R2的A-C流量)的速率大于R,即,从R1到R2的链容量。如果 λi为所有连接(包括B-D连接)的巨大值,那么在R2上,B-D流量的到达率可能比A-C流量的到达率高得多。因为A-C和B-D的流量必须在路由器R2上竞争有限的缓冲空间,所以当B-D连接的供电负荷增加时,通过R2的成功的A-C连接(即不会因缓存溢出而丢失)越来越少。在极限情况下,当供应负荷接近无限时,R2的空缓存将立即由B-D连接的子组填充,因此,R2上的A-C连接接近0。这又一次说明
在负荷限制下,A-C端到端的吞吐量将接近零。 这些考虑导致了供应负荷和吞吐量之间的差距
的权衡,如图所示。考虑网络浪费的工作量时,由于供应负荷增加,吞吐量最终减少的原因是显而易见的.在上述大流量的情况下,每当第二跳步路由器丢弃一个子集时,第一个跳跃者将团队转移到第二个跳跃者所做的工作是“徒劳”。如果第一个跳跃路由器只是丢弃子组并保持空,网络上的情况很幸运(更确切地说,很糟糕)。需要指出的是,第一个跳跃者用来将一个子集转移到第二个跳跃者使用的传输能力对于不同的子集的转移可能更有效。
从以上知识,我们可以总结交通堵塞控制的原因:

四种方法即 slow start congestion 避免快速的重新传输快速的恢复

当TCP连接启动时,cwnd的值通常最初设置为一个MSS的较小值,这使得初始传输速率接近MSS/RTT。例如,如果MSS=500字节和RTT=200ms,初始传输速率约为20kbps。因为对于TCP发送者来说,可用的带宽可能比MSS/RTT大得多,TCP发送方我们希望尽快找到可用的带宽量.
慢启动:cwnd的值从一个MSS开始,每当传输的消息段第一次确认时,都会增加一个MSS。TCP将第一个消息发送到网络,等待确认。当该确认到达时,TCP发送器将添加一个RMSS到拥挤窗口,并发送两个最大长度消息段。报告 的 两 段 得到 证实,然后发送者将添加一个MSS到每个确认消息节到拥挤窗口,把拥挤窗口改为4个MSS,并这样下去。这个过程每次转会都会发生,发送速率就翻番。因此,TCP传输速度开始缓慢,但缓慢的开始阶段是指数增长。
ssthresh:慢启动阈值;在检测拥挤时重新设置到窗口的一半。
拥塞避免模式:因此,当cwnd值等于 ssthresh时,慢启动结束,TCP将转移到避免拥堵模式。
假设初始如图所示:
快速重传算法允许发送者尽可能早地知道消息的各个段落的丢失发生。

快重传:当出现超时时,TCP拥堵避免了相同的算法行为。跟慢启动一样,当数据包丢失时,cwnd的值设置为1MSS,ssthresh值更新为cwnd值的一半。然而,前面提到的丢失事件也可以由三个冗余的ACK事件触发。在这种情况下,网络继续从接收者发送消息段(如 redundant ACK 接收的指示)。因此,TCP对这个数据包丢失事件的行为,与包装的加班指令相比,不应如此剧烈:TCP将cwnd值降低一半(为了提高测量结果,增加三个MSS到三个冗余的ACK),当三个冗余的ACK被接收时, ssthresh的值记录为cwnd的一半。下一步是进入快速恢复模式。
快恢复:
在快速恢复中,对于导致TCP输入快速恢复状态的缺失消息段,对于每个冗余的ACK接收, cwnd的值增加了一个MSS。最终,当ACK到达缺失消息段时,在减少交通堵塞后,TCP能够避免交通堵塞.如果出现超时事件,在执行慢启动和避免拥挤的动作后快速恢复,进入慢启动状态:当发生包丢失事件时,cwnd的值设置为一个MSS, ssthresh的值设置为cwnd的一半。快速恢复是TCP推荐的,而不是必要的组成部分。TCP的早期版本叫做TCPTahoe,是否存在过时指示包装事件,ACK指出还有三个冗余的包丢失事件,所有无条件地将交通拥挤的窗口减少到一个MSS,并进人慢启动阶段。新版本的TCP,TCP Reno,结合快速恢复。

我们知道,TCP协议已经通过超时/重传处理报告段落丢失的机制虽然从概念上来说很简单,但在执行超时/重传输机制时,如TCP等实时协议时,会出现许多微妙的问题。
RTT:实例RTT是发送消息(即给IP)和接收消息的确认之间的时间。
情况一:如图所示,RTT时间(overtime retransmission time)比RTT时间少,不需要重发消息;

情况二: RTO(超时再传输时间)比RTT时间长得多,如图所示,再传输时间太长,因此网络自由时间增加;

问题:这个间隔应该有多大?我应该在开始时如何估计返回时间和返回时间? 是否应该为所有未识别的报告段落设置计时器?
大多数TCP实现只一次测量一个RTT(样品RTT)。而不是测量每个发送消息段的RTT.这就是说,在任意时刻,估计只发送但尚未确认消息段的RTT,这将生成一个新的RTT值,接近每个RTT。另外,TCP从不计算再传输的消息段的RTT;它只测量一次传输的消息段。
由于路由器拥挤和终端系统负载的变化,这些段落的RTT值将相应波动。由于这种波动,任何给定的RTT值可能不是典型的。因此,为估计一个典型的RTT,采用某种平均的方法来处理转帐.TCP 保持 RTT 的统一值.一旦你得到新的RTT,TCP将根据以下公式更新RTT:

新RTT值是以前RTT值和新RTT值的组合。[RFC 6298]中的a值为α=0.125(即 1/8);
RFC6298建议使用以下计算:


我们 可以 看到, RRTT 和 RRTTd 都 与 新 的 RRTT 样本 有关 ; 但 也 发生 了 下列 两 个 情况 :
在线网速测试 整理编辑,转载请注明出处。