Loading... ## 传输层的作用 首先在讲TCP/IP协议族之前,我们先来了解一下传输层。 1. 传输层提供面向连接和无连接的服务(TCP/UDP) 2. 维护连接状态 3. 对数据进行分段和封装(网络只能发送长度有限的数据包) 4. 多路复用(端口号的概念呢,一个IP地址对应多个应用程序或服务) 5. 可靠传输(对错误、丢失、乱序的包检测纠错) 6. 流量控制(对接收方的数据接收速率进行协调,避免浪费) ## 什么是TCP、UDP TCP(Transfer Control Protocol)传输控制协议 UDP(User Datagram Protocol)用户数据报文协议 两者都是TCP/IP协议族中最重要协议之一 TCP是面向连接的可靠传输层协议,一对一的通信 UDP是无连接的传输协议,我们看视频什么的都是基于UDP流试传输数据 ## TCP的特点 - **三次握手** 通过三次握手来建立可靠连接 - **端口号** 可以用端口号来标识上层协议和服务,实现网络多路复用 - **完整性校验** (Checksum)校验和计算,保证了接受方能检测到传输过程中可能出现的差错 - **确认机制** 对于正确收到的数据包接收方通过应答通过发送方,超过一段时间没有收到应答则重传 - **序列号** 所有的数据都拥有唯一的序列号,通过序列号来将数据进行确认、乱序重排 - **窗口机制** 可以通过调节抽象的窗口,来限制接收方最大的传输速率,从而控制数据流量 ## TCP报文格式  依旧还是老惯例,我们逐层来解释他的意思和作用: - **Source Port ** <code>源端口 - 16Bit</code> 和源IP组合起来使用,对报文表示返回地址 - **Destination Port** <code>目的端口 - 16Bit</code> 对应接受方计算机上的服务、应用程序的端口 - **Sequence Number** <code>序列号 - 32Bit</code> 用来标识源端设备向目的端发送的数据的编号,(相当于一个计数器) - **Acknowledgement** <code>确认号 - 32Bit</code> 用来标识请求对方下次发送的数据报文的编号 - **Data Offset** <code>数据偏移 - 4Bit</code> 用来标识分片后的数据,在源数据中的位置 - **Reserved** <code>保留位 - 6Bit</code> 暂时还没有其他作用,留着占位,以便以后新增内容 - **Control ** <code>控制位 - 6Bit</code> 控制着六个功能的开关 分别是<code>URG</code><code>ACK</code><code>PSH</code><code>RST</code><code>SYN</code><code>FIN</code> - **URG** 紧急指针 - **ACK** 确认字段标志 - **PSH** 提交缓存数据 - **RST** 复位开关(可以用来强行中断TCP连接) - **SYN** 握手开关 - **FIN** 结束开关 - **Windows** <code>窗口尺寸 - 16Bit</code> 用于标识自己期望收到的数据字节 - **Checksum** <code>校验和 - 16Bit</code> 对源数、目的据计算产生的结果,源目数据计算出来的应该是相等,数据才是完整的 - **Urgent Pointer** <code>紧急指针 - 16Bit</code> - **Options** <code>可选项</code> - **Padding** <code>填充 </code> 加入额外的数据,保证TCP头部是32位的整倍数 ## 端口号的概念 IP网络中,通常一个IP地址标识一个主机,但是主机上有多个进程服务要被其他网络所访问,要标识这些程序、服务就引入了TCP/UDP端口号,用来标识程序或服务 协议号TCP:6 协议号UDP:17  端口的取值范围是0~65535 其中0-1023端口有IANA号码分配机构统一管理 1024-65535为我们的随机端口 几个常见应用的端口号: <code>Telnet:23/TCP</code> <code>FTP:20/21/TCP</code>(20数据传输,21连接控制) <code>HTTP:80/TCP</code> <code>HTTPS:443/TCP</code> <code>SMTP:25/TCP</code> <code>DNS:53/UDP</code> <code>TFTP:69/UDP</code> <code>SNMP:161/UDP</code> <code>BootP:67/68/UDP</code> ## TCP三次握手 TCP通过三次握手来建立可靠连接 1. 由发起方 HostA 向被叫方 HostB 发出连接请求。将段的序列号标为 a,SYN 置位,由于是双方发的第一个包,ACK 无效。 2. HostB 收到连接请求后,读出序列号为 a,发送序列号为 b 的包,同时将 ACK 置为有效,将确认号置为 a+1,同时将 SYN 置位。 3. HostA 收到 HostB 的连接确认后,对该确认再次作确认。HostA 收到确认号为 a+1、序列号为 b 的包后,发送序列号为 a+1、确认号为 b+1 的段进行确认 4. HostB 收到确认报文后,连接建立 PS:看文字容易搞混,最好还是看流程图,在配合抓包测试  ## TCP的四次挥手 TCP在控制段中开启FIN功能来关闭一个TCP连接 1. HostA 要求终止连接,发送序列号为 p 的段,FIN 置为有效,同时确认此前刚收到的 段。 2. HostB 收到 HostA 发送的段后,发送 ACK 段,确认号为 p+1,同时关闭连接。 3. HostB 发送序列号为 q 的段,FIN 置为有效,通知连接关闭。 4. HostA 收到 HostB 发送的段后,发送 ACK 段,确认号为 q+1,同时关闭连接 还是和三次握手相似,如果要强制关闭连接,只需要开启RST功能即可,无需进行四次挥手就可断开连接。  ## TCP重传机制 当其中一个数据丢失时,被接收方只需要向接收方单独发送丢失数据的请求即可  ## TCP滑动窗口机制 通过告知对方本机数据的接收能力,来实现对数据流量的控制 当TCP发送重传后,会主动缩减窗口尺寸 当TCP稳定传输时,会逐渐增大窗口尺寸  ## UDP报文格式 相比于TCP而言UDP的报文格式就简单了许多  这里我们只对新出现的条目做解释,其他条目和TCP的解释一样 - **Length** <code>长度 - 16Bit</code> 里面包含了UDP头部和数据在整改UDP数据报文中的长度,单位字节 ## TCP与UDP的对比  TCP更适用于对于数据完整性要求较高,对数据传输延低的场景 UDP更适用于对传输延时高,但对数据完整性要求较低的场景(视频流的传输,音频流的传输都是基于UDP) 最后修改:2022 年 12 月 19 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏