首页 > 编程知识 正文

tcp和udp的工作原理,TCP通讯协议

时间:2023-05-04 12:08:29 阅读:120123 作者:2295

3358 www.Sina.com/http://www.Sina.com /互联网由一系列协议组成。 TCP是其中的一个层,有自己的分工。

(图片说明: TCP是以太网协议和IP协议的上层协议,也是APP应用层协议的下层协议。 )最底层的以太网(以太网)规定了电子信号如何构成分组(packet ),解决了子网内部的点对点通信。

(图片说明:以太网协议解决了局域网点对点通信。 )但是,以太网协议无法解决多个局域网如何互操作。 这将通过IP协议解决。

(图像说明: IP协议可以连接到多个局域网。 ) IP协议定义了自己的地址规则,称为IP地址。 实现路由功能,以便一个局域网中的a主机可以向另一个局域网中的b主机发送消息。

(图片说明:路由器基于IP协议。 局域网之间必须通过路由器连接。 )路由原理很简单。 市场上的所有路由器背后都有很多网口,需要接入多条网线。 路由器内部有路由表,段a的IP地址为出口1,段b的地址为出口2,……通过这个“路标”,实现了数据包的转发。

照片说明:本机路由表中注明不同IP地址的数据包将发送到哪个互联网端口(接口)。 ) IP协议只是地址协议,并不能保证数据包的完整性。 如果路由器上存在数据包丢失(例如,如果缓存已满,新传入的数据包将丢失),则需要发现丢失了哪些数据包以及如何重新发送这些数据包。 这取决于TCP协议。 简而言之,TCP协议的作用是保证数据通信的完整性和可靠性,防止丢包。 3358 www.Sina.com /以太网分组(packet )的大小固定,最初为1518字节,后来增加到1522字节。 这里,1500字节是有效载荷(payload ),22字节是头信息(head )。 IP分组位于以太网分组的负载中,它还有自己的报头信息,最少需要20字节,因此IP分组的负载最大为1480字节。

图片说明: IP数据包位于以太网数据包中,TCP数据包位于IP数据包中。 ) TCP分组在IP分组的负载内。 由于其头信息最低需要20字节,所以TCP分组的最大负载为1480 - 20=1460字节。 TCP负载实际上约为1400字节,因为IP和TCP协议经常添加标头信息。 因此,一个1500字节的信息需要两个TCP包。 HTTP/2协议的一大改进是压缩HTTP协议的头信息,并将一个HTTP请求放在一个TCP包中,而不是拆分成多个,从而提高速度。

图说明:以太网数据包负载为1500字节,TCP数据包负载为1400字节左右。 )TCP 是互联网核心协议之一,本文介绍它的基础知识。包1400字节必须分成多个包才能同时发送大量数据。 例如,一个10MB的文件需要发送7100多个数据包。 发送时,TCP协议对每个数据包进行编号(SEQuence number,简称seq ),以便接收方可以按顺序恢复。 即使万一发生丢包,也知道丢失的是哪个包。 第一个包的编号是随机数。 为了容易理解,这里把它称为一号包。 假设该分组的负载长度为100字节,则可以估计下一个分组的编号为101。 也就是说,每个包都有两个编号:它自己的编号和下一个包的编号。 接收方知道应该按照什么顺序将它们恢复为原始文件。

图片说明:当前数据包的编号为45943,下一个数据包的编号为46183,您可以看到该数据包的负载为240字节。 )收到3358www.Sina.com/TCP数据包后,组装恢复由操作系统进行。 该APP应用程序不直接处理TCP数据包。 对于APP应用程序来说,不需要在意数据通信的详细情况。 只要线路不异常,收到的总是完整的数据。 APP应用程序所需的数据包含在TCP数据包中,并具有自己的格式(例如HTTP协议)。 TCP不提供表示原始文件大小的机制。 这是由APP应用层协议规定的。 例如,HTTP协议包括表示信息主体大小的头信息Content-Length。 对操作系统来说,就是连续接收TCP分组并依次对它们进行组装,有不少单个分组。 操作系统不处理TCP数据包中的数据。 TCP数据包组装后,将它们传递给APP应用程序。 TCP数据包包含端口参数,用于指定转发到接收端口的APP应用程序。

(图片说明:系统根据TCP数据包中的端口,将组装后的数据传输到相应的APP应用程序。 在上图中,21个端口是FTP服务器,25个端口是SMTP服务,80个端口是Web服务器。 该APP应用程序会接收组装后的原始数据,并以浏览器为例,根据HTTP协议的Content-Length字段正确读取段中的数据。 这意味着一次TCP通信中也可以包含多个HTTP通信。一、TCP 协议的作用服务器发送数据包。 当然越快越好。 最好一次全部拿出来。 但是,快速发送的话,有可能会发生丢包。 许多因素都会导致丢包,包括带宽低、路由器过热、缓存溢出等。 线路不好的话,发送得越快就越丢。 理想的状态是在线路允许的情况下达到最高速度。 但是怎么做对方线路的

理想速率是多少呢?答案就是慢慢试。 TCP 协议为了做到效率与可靠性的统一,设计了一个慢启动(slow start)机制。开始的时候,发送得较慢,然后根据丢包的情况,调整速率:如果不丢包,就加快发送速度;如果丢包,就降低发送速度。 Linux 内核里面设定了(常量TCP_INIT_CWND),刚开始通信的时候,发送方一次性发送10个数据包,即”发送窗口”的大小为10。然后停下来,等待接收方的确认,再继续发送。 默认情况下,接收方每收到两个 TCP 数据包,就要发送一个确认消息。”确认”的英语是 acknowledgement,所以这个确认消息就简称 ACK。 ACK 携带两个信息。 期待要收到下一个数据包的编号接收方的接收窗口的剩余容量 发送方有了这两个信息,再加上自己已经发出的数据包的最新编号,就会推测出接收方大概的接收速度,从而降低或增加发送速率。这被称为”发送窗口”,这个窗口的大小是可变的。

(图片说明:每个 ACK 都带有下一个数据包的编号,以及接收窗口的剩余容量。双方都会发送 ACK。) 注意,由于 TCP 通信是双向的,所以双方都需要发送 ACK。两方的窗口大小,很可能是不一样的。而且 ACK 只是很简单的几个字段,通常与数据合并在一个数据包里面发送。

图片说明:上图一共4次通信。第一次通信,A 主机发给B 主机的数据包编号是1,长度是100字节,因此第二次通信 B 主机的 ACK 编号是 1 + 100 = 101,第三次通信 A 主机的数据包编号也是 101。同理,第二次通信 B 主机发给 A 主机的数据包编号是1,长度是200字节,因此第三次通信 A 主机的 ACK 是201,第四次通信 B 主机的数据包编号也是201。) 即使对于带宽很大、线路很好的连接,TCP 也总是从10个数据包开始慢慢试,过了一段时间以后,才达到最高的传输速率。这就是 TCP 的慢启动。 六、数据包的遗失处理 TCP 协议可以保证数据通信的完整性,这是怎么做到的? 前面说过,每一个数据包都带有下一个数据包的编号。如果下一个数据包没有收到,那么 ACK 的编号就不会发生变化。 举例来说,现在收到了4号包,但是没有收到5号包。ACK 就会记录,期待收到5号包。过了一段时间,5号包收到了,那么下一轮 ACK 会更新编号。如果5号包还是没收到,但是收到了6号包或7号包,那么 ACK 里面的编号不会变化,总是显示5号包。这会导致大量重复内容的 ACK。 如果发送方发现收到三个连续的重复 ACK,或者超时了还没有收到任何 ACK,就会确认丢包,即5号包遗失了,从而再次发送这个包。通过这种机制,TCP 保证了不会有数据包丢失。

(图片说明:Host B 没有收到100号数据包,会连续发出相同的 ACK,触发 Host A 重发100号数据包。)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。