开发12年老码农再谈:TCP协议详解(tcpsh)

开发12年老码农再谈:TCP协议详解二、处理输入数据报:首先检查其合法性,然后进行寻径–假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚

2. 处理输入数据报。首先检查其有效性,然后执行路径搜索。如果数据报到达接收器机器,它会删除标头,如果数据报尚未到达,它将剩余部分传递给适当的发送协议。接收器机器,数据报被传输。

3.处理路径、流量控制、拥塞等问题。

网络接口层:

这是TCP/IP 软件的最低层,它接收IP 数据报并通过网络发送它们,从网络接收物理帧,提取IP 数据报,并将它们传递到IP 层,我将负责以下工作:

IP 是无连接的

IP用于计算机之间的通信。

IP 是一种无连接通信协议。它不限制两台通信计算机之间的通信线路。这样,IP 就减少了对网络线路的需求。每条线路可以同时满足多台不同计算机的通信需求。

IP 允许将消息(或其他数据)分解为小的独立数据包并通过Internet 在计算机之间发送。

IP 负责将每个数据包路由到其目的地。

IP地址

每台计算机都需要一个IP 地址才能连接到互联网。

每个IP 数据包都需要一个地址才能发送到另一台计算机。

网络上的每个节点都需要一个单独的Internet 地址(也称为IP 地址)。常用的IP 地址是32 位数字,称为IPv4 标准。这些32 位数字分为四组:255.255.255.255。根据IPv4标准,地址分为五类,通常使用B类地址。具体分类请参考其他文档。请注意,IP地址是网络号和主机号的组合,这一点非常重要。

CP/IP 使用32 位进行寻址。一个计算机字节是8 位。因此,TCP/IP 使用4 个字节。

一个计算机字节可以包含256 个不同的值。

00000000、00000001、00000010、00000011、00000100、00000101、00000110、00000111、00001000…直至11111111。

现在您知道为什么TCP/IP 地址是0 到255 之间的四个数字了。

TCP 使用固定的连接

TCP 用于应用程序之间的通信。

当一个应用程序想要通过TCP 与另一个应用程序通信时,它会发送一个通信请求。该请求必须发送到准确的地址。两者之间“握手”后,TCP 在两个应用程序之间建立全双工通信。

这种全双工通信占用两台计算机之间的通信线路,直到被一方或双方断开连接。

UDP 与TCP 类似,但更简单且可靠性较差。

IP 路由器

当IP 数据包从计算机发出时,它会到达IP 路由器。

IP 路由器负责将数据包直接或通过另一个路由器路由到目的地。

在同一通信中,一个数据包可能采用与另一个数据包不同的路由。路由器负责根据流量、网络错误或其他参数指定正确的地址。

域名

十二个阿拉伯数字很难记。使用名称更容易。

用于TCP/IP 地址的名称称为域名。 w3school.com.cn 是域名。

如果您输入http://www.w3school.com.cn这样的域名,DNS程序会将域名转换为数字。

世界各地有大量连接到互联网的DNS 服务器。 DNS 服务器负责将域名转换为TCP/IP 地址,并用新的域名信息更新彼此的系统。

当新域名及其TCP/IP 地址注册时,世界各地的DNS 服务器会更新此信息。

TCP/IP

TCP/IP 意味着TCP 和IP 一起工作。

TCP负责应用软件(如浏览器)和网络软件之间的通信。

IP负责计算机之间的通信。

TCP 负责分解数据,将其加载到IP 数据包中,并在到达时重新组装。

IP 负责将数据包传送给接收者。

TCP报文格式

16位源端口号:16位源端口包含初始化通信的端口。源端口和源IP 地址有助于识别数据包的返回地址。

16 位目标端口号:16 位目标端口字段定义传输的目的。该端口指定接收消息的计算机上的应用程序地址接口。

32 位序列号:接收计算机使用32 位序列号将消息重新分区回其原始格式。如果看到SYN,序列码实际上是初始序列号(ISN),第一个数据字节是ISN+1。该序列号(序列码)可用于补偿传输不匹配。

32 位确认序列号:接收计算机使用32 位序列号将分段消息重新组装为其原始格式。如果设置了ACK 控制位,则该值表示接收到的数据包的序列码。

4 位标头长度:这4 位包含TCP 标头大小,指示数据从何处开始。

保留(6 位):6 位值范围。这些位必须为0。保留供未来新用途定义。

Flag:6位标志字段。表示为紧急标志、有意义响应标志、推送、重置连接标志、同步序号标志、数据传输完成标志。按顺序:URG、ACK、PSH、RST、SYN、FIN。

16位窗口大小:用于指示接收到的每个TCP数据段的大小。 TCP 流量控制由连接的两端通过声明的窗口大小提供。窗口大小是接收方期望接收的字节数,从确认序列号字段中指定的值开始。窗口大小是一个16 字节字段,因此最大窗口大小为65535 字节。

16 位校验和:16 位TCP 标头。源机器根据数据内容计算出一个值,接收机器必须产生与源机器相同的值,以证明数据的有效性。校验和覆盖整个TCP 段。这是必填字段,必须由发件人计算和存储并由收件人验证。

16位紧急指针:指向加急数据后面的字节。仅当设置了URG 标志时才有效。如果未设置URG标志,则设置紧急字段。快速处理标记为紧急的数据段。

可选:可变长度,但必须为1 字节长。无选项表示该1 字节字段等于0。

数据:TCP 协议数据包有效负载内的数据。

在上述字段中,6位标志字段中各个选项的功能如下。

URG:紧急标志。紧急标志为\”1\”表明该位有效。

ACK:确认标志。表明确认编号栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。

PSH:推标志。该标志置位时,接收端不将该数据进行队列处理,而是尽可能快地将数据转由应用处理。在处理Telnet或rlogin等交互模式的连接时,该标志总是置位的。

RST:复位标志。用于复位相应的TCP连接。

SYN:同步标志。表明同步序列编号栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。

FIN:结束标志。

TCP三次握手

所谓三次握手是指建立TCP连接时,客户端和服务器必须总共发送3个数据包来确认连接的建立。在socket编程中,这个过程是由客户端建立连接触发的。整个流程如下图所示。

(1)初次握手:客户端将标志位SYN设置为1,随机生成值seq=J,并向服务器发送数据包。客户端进入SYN_SENT状态并等待服务器的确认。

(2)第二次握手:服务器收到数据包后,从标志位SYN=1识别出客户端正在请求建立连接,并将标志位SYN和ACK都设置为1(ack=J+1)。然后随机生成值seq=K,向客户端发送数据包以确认连接请求,服务器进入SYN_RCVD状态。

(3) 第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1。如果正确,则将标志位ACK设置为1,ack=K+1,并设置ACK=K+1。当你向服务器发送数据包时,服务器会检查ACK是否为K+1以及ACK是否为1。如果正确,则客户端和服务器端建立成功,并处于ESTABLISHED状态,完成三次握手。然后客户端和服务器就可以开始发送数据了。

简单来说,就是

1、建立连接时,客户端向服务器发送SYN数据包(SYN=i),进入SYN-SEND状态,等待服务器的确认。

2. 当服务器收到SYN数据包时,它必须确认客户端的SYN(ack=i+1),同时也发送SYN数据包(SYN=k),即SYN+ACK数据包。此时服务器处于SYN-RECV状态。

3. 客户端收到服务器发送的SYN+ACK 数据包,并向服务器发送确认ACK(ack=k+1)。发送数据包后,客户端和服务器均处于ESTABLISHED状态,三通完成。握手发生,客户端和服务器开始发送数据。

同步攻击:

在三向握手过程中,服务器发送SYN-ACK 到收到客户端ACK 之间的TCP 连接称为半开连接。此时服务器收到ACK后进入SYN_RCVD状态。转至ESTABLISHED 状态。 SYN攻击是指客户端在短时间内伪造大量不存在的IP地址,由于源地址未经服务器验证,服务器发回确认包并等待客户端确认。如果存在,服务器必须不断地重新输入IP地址,直到超时,而这些伪造的SYN数据包会长期占用未连接队列,导致正常的SYN请求在队列满时被丢弃,出现网络拥塞或系统拥塞。麻痹。 SYN攻击是一种典型的DDOS攻击,如果服务器上有很多半连接并且源IP地址是随机的,则很容易检测到SYN攻击。要检测SYN 攻击,请使用以下命令:

#netstat -nap | SYN_RECV

TCP四次挥手

所谓的四向挥手终止TCP 连接。这意味着当断开TCP连接时,客户端和服务器必须总共发送4个数据包来确认断开。在socket编程中,这个过程是由客户端或服务器执行close来触发的。整个流程如下图所示。

TCP 连接是全双工的,因此每个方向必须单独关闭。这个原理只是指一方完成数据传输任务后,发送FIN来终止该方向的连接。数据朝这个方向流动。也就是说,不再接收数据,但可以在该TCP 连接上发送数据,直到FIN 也沿该方向发送为止。如上图所示,要关闭的一方执行主动关闭,另一方执行被动关闭。

(1)第一次挥手:客户端发送FIN,完成客户端向服务器发送数据,客户端进入FIN_WAIT_1状态。

(2)第二次挥手:服务器收到FIN后,将收到的序列号+1发送给客户端作为确认序列号(与SYN相同,1个FIN占用1个序列号)。 CLOSE_WAIT 状态。

(3)第三次挥手:服务器发送FIN,完成服务器向客户端发送数据,服务器进入LAST_ACK状态。

(四)

第四次挥手:客户端收到FIN后,进入TIME_WAIT状态,确认序号变为收到的序号+1。服务器进入CLOSED状态并完成四波。

为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

这是因为在LISTEN状态下,服务器收到连接请求的SYN报文后,会将ACK和SYN一起发送给客户端。当你关闭连接时,当你收到对方的FIN报文时,只是表示对方不再发送数据了,但是你仍然可以接收数据,并不是所有的数据都会发送给对方,所以你可以关闭现在或发送一些数据。数据发送给对方后,会向对方发送FIN报文,表示同意终止连接,所以你的ACK和FIN通常是分开发送的。

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

有两个原因。

1. 确保TCP 协议的全双工连接已关闭。

2. 验证该连接的重复数据段是否已从网络中删除。

让我解释一下第一点。如果客户端直接CLOSED,由于IP协议不可靠或者其他网络原因,服务器收不到客户端最终响应的ACK。超时后,服务器继续发送FIN。此时,客户端已关闭,因此无法找到与重新提交的FIN 相对应的连接。最终,服务器收到RST 而不是ACK。连接错误。请向高级管理层报告该问题。这种情况不会造成数据丢失,但确实妨碍了TCP 协议满足可靠连接的要求。所以客户端不用直接进入CLOSED状态,而是可以在再次收到FIN时维持TIME_WAIT,验证对方是否收到了ACK,最后正确关闭连接。

我们来讨论第二点。如果客户端直接CLOSED,然后向服务器发起一个新的连接,则不能保证这个新连接的端口号会与刚刚关闭的端口号不同。即,新连接和旧连接可以具有相同的端口号。一般来说,不会出现该问题,但特殊情况仍然存在。也就是说,假设新连接的端口号与已关闭的旧连接的端口号相同,并且来自先前连接的数据仍在该端口号上。这些延迟的数据只有在新连接之后才到达服务器,因为新旧连接具有相同的端口号,并且TCP协议根据套接字对确定不同的连接。 TCP协议假定延迟的数据属于新连接,并与实际的新连接数据包混淆。因此,TCP连接在TIME_WAIT状态下等待的时间必须是MSL的两倍,这可以确保该连接上的所有数据都从网络中擦除。

【学习笔记】

点击Android高级工程师进阶学习,加入圈子领取资料,学习交流!

【Android高级工程师高级系统面试题】:下载链接

全套Android进阶学习手册

最后

多年来,编辑了解到,大多数入门级和中级Android工程师想要提高自己,往往必须自己探索和成长,这是不系统的、短暂的,我了解到这并没有帮助。

因此,我们收集整理了《2024年Android移动开发全套学习资料》册。最初的目的也很简单。换句话说,我们想帮助那些想学习、提高自己,但不知道从哪里开始的朋友。

由于文件较多,这里仅展示部分目录截图。这套完整的内容包括对领先制造商的采访、学习笔记、源代码讲义、实践项目、概述路线、电子书和教学视频。它将继续更新。

一个人可以走得快,但一群人可以走得更远。无论是IT行业的资深人士还是对IT行业感兴趣的新人。

欢迎任何人加入我们的圈子(技术交流、学习资源、职场投诉、大公司内部推荐、面试指导),让我们一起学习、成长!

如果您需要此信息,请从第 栏中获取。

四)]

由于文件较多,这里仅展示部分目录截图。这套完整的目录包括对领先制造商的采访、学习笔记、源代码讲义、实践项目、概述路线、电子书和教学视频。它将继续更新。

一个人可以走得快,但一群人可以走得更远。无论是IT行业的资深人士还是对IT行业感兴趣的新人。

欢迎任何人加入我们的圈子(技术交流、学习资源、职场投诉、大公司内部推荐、面试指导),让我们一起学习、成长!

如果您需要此信息,请从第 栏中获取。

#以上是一个12岁程序员的成长历程。相关TCP协议Source Network详细讲解的内容仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92491.html

Like (0)
CSDN的头像CSDN
Previous 2024年6月27日
Next 2024年6月27日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注