资讯动态

Linux——UDP协议与TCP协议

发布时间:2026/10/17 2:45:20 来源:尧图企业网站定制
一、UDP协议一协议格式源端端口对端端口描述通信两端进程数据报长度描述包含UDP头部在内的包长度数据包长度2字节范围0~65535因此UDP报文最大总长度64KB最大数据长度UDP报文最大总长度-头部长度64KB-8B校验和用于校验收到的数据和发送的数据是否一致算法二进制反码求和算法填充报文数据将校验和置0针对报文所有数据逐字节取反相加求和得到的值填充到校验和字段中接收方收到数据后逐字节反码求和得到的结果是0则表示数据一致二协议特性UDP协议特性无连接、不可靠、面向数据报1.无连接连接本质是通信双方对于对方的状态维护无连接就是通信双方不需要管理对方的状态只需要知道对方的地址就可以发送数据2.不可靠不保证数据安全、有序的到达对端3.面向数据报有最大长度限制的传输方式数据长度64KB-8B数据传输是一种块式传输收发都是以块为单位。数据报传输的时候报文中明确标识了报文长度接收方接收数据的时候一次只能读取完整一个报文不允许出现读半个或者一次性读取多个报文的情况。三UDP编程注意事项UDP不保证数据安全有序到达对端因此若有此需求需要程序员在应用层进行安全管理、包序管理udp报文有最大长度限制因此若发送的数据过大则需要程序员在应用层进行分包将大数据分割成多个小段进行发送UDP无连接因此支持广播传输通过一次sendto发送数据可以将数据发送给当前局域网网络中的所有主机二、TCP协议一协议格式源端端口对端端口描述通信两端进程序号实现有序传输的核心字段描述了数据的序号确认序号实现有序传输的核心字段头部长度以4字节为单位描述整个TCP头部长度是TCP报文解析的核心字段例如若头长的值5则说明整个TCP头部长度为20字节TCP头部最小是20字节最大是60字节取决于选项数据的大小保留字段暂时没有用到标志位URG紧急指针有效位用于表示后面的紧急指针数据是否有效ACK确认应答标志位标识当前报文是一个确认应答报文用于连接建立PSH立即传输标志位TCP默认有延迟发送机制该标志位用于标识立即发送不要延迟RST重置连接标志位通知对方若要通信则重新建立连接SYN建立连接标志位标识当前报文是一个连接建立请求报文FIN连接断开标志位标识当前报文是一个连接断开报文用于通知对方本方不再发送数据窗口大小用于TCP的滑动窗口机制实现流量控制避免发送方发送数据过快导致丢包校验和二进制反码求和算法实现校验接收到的数据与发送数据是否一致紧急指针存储一个偏移量指向紧急数据的末尾选项数据通常用于连接建立时的一些协商数据二协议特性TCP协议特性面向连接可靠传输面向字节流1.面向连接通信双方需要维护对方的状态以便于保存数据传输是有效的、有意义的连接管理三次握手建立连接四次挥手断开连接1三次握手为什么是三次握手不是两次或四次两次握手无法确认双方的收发能力都正常也无法防止历史过期连接请求导致的连接错乱三次握手可以确认双方的收发能力都正常同步初始序列号避免脏连接四次握手没有必要因为每个报文都要传输报头占据带宽三次握手中若出现超时双方如何处理情况一客户端发送SYN报文后等待超时客户端会重传SYN请求有次数限制情况二服务端发送SYNACK报文后等待超时也就是说客户端没有对服务端进行确认服务端会给客户端回复一个RST报文然后释放socket2四次挥手为什么是四次挥手不是三次TCP是全双工协议两个方向的连接需要分别关闭。FIN仅代表本方不再给对方发送数据但是对方仍可以给本方发送数据当被动关闭方收到FIN时可能还有数据未发送完成因此不能立即同时回复FINACK必须先回复ACK确认等数据发送完毕再发FIN因此一共是四次。TIME_WAIT状态有什么作用TIME_WAIT状态是主动关闭方在收到了被动关闭方的FIN报文并进行了ACK报文回复后进入的状态主动关闭方进入TIME_WAIT状态后再等待2个MSL时间后就会进入CLOSED状态释放连接因为主动关闭方最后一次的ACK报文可能会丢失被动关闭方若收不到ACK则会在等待超时后重传FIN而如果主动关闭方不进行2MSL的等待直接进入CLOSED状态释放连接那么这时就可能有与这个主动关闭方地址相同的新的连接收到这个重传的FIN因此为了避免产生这种情况主动关闭方需要等待2个MSL后再进入CLOSED状态释放连接为什么是2MSL?MSL报文最大生命周期第一个MSL是保证ACK的最大生命周期第二个MSL是重传的FIN的最大生命周期一台主机上出现了大量的TIME_WAIT连接是什么原因如何解决TIME_WAIT是主动关闭方才会出现的状态一台主机上若出现了大量的TIME_WAIT就意味着主机上频繁且大量的在进行主动连接关闭操作这种情况常见于主机上运行了爬虫程序。解决方案方案一使用setsockopt接口进行套接字选项设置开启地址重用开启后就可以复用处于TIME_WAIT状态的地址方案二进行系统配置设置将TIME_WAIT等待时间调短一台主机上出现了大量的CLOSE_WAIT连接是什么原因CLOSE_WAIT是被动关闭方在收到FIN并进行ACK回复后进入的状态等待上层关闭连接若主机上出现了大量的CLOSE_WAIT可能是代码中遗漏了close关闭连接操作连接断开在程序中的表现recv取完所有的数据后返回0不再阻塞send触发异常SIG_PIPE让程序直接退出若想要避免退出可以忽略或自定义SIGPIPE信号的处理方式TCP的连接保活机制服务端与客户端若长时间默认7200s没有数据往来则会每隔一段时间默认75s给客户端发送一个保活探测数据包要求客户端进行确认回复若连续多次默认9次都没有收到回复则认为连接断开释放资源。默认数值可以通过setsockopt套接字选项设置也可以通过改变系统配置2.可靠传输保证数据安全、有序的到达对端借助协议中的序号和确认序号字段进行包序控制以及接收方丢包检测核心发送方和接收方如何发现出现了丢包丢包后该如何处理如何尽量避免丢包1确认应答机制与超时重传机制确认应答机制发送方针对发送的每一个字节数据都要求接收方收到之后进行确认回复若发送数据后长时间没有收到回复则认为丢包超时重传机制发送方等待超时发现丢包后就会对原来的数据进行重传确认应答机制和超时重传机制都依赖于协议中的序号和确认序号字段快速重传协议在管线化传输中接收方收到了后面的数据但是没有收到前面的数据则会对前面缺失的数据进行重复的确认应答当发送方连续收到3次同一个确认序号的确认报文则会立即从指定确认序号开始重传数据不再等待超时丢包后的重传机制停等协议每发送1个报文停下来等待ACK回复收到ACK之后才发下一个报文适用于网络极差的环境回退n步协议从丢掉的报文开始往后的数据都重传适用于网络一般的环境选择重传协议针对丢掉单个报文进行重传适用于网络较好的环境2滑动窗口机制滑动窗口机制借助协议中的窗口大小字段接收方告诉发送方最多可以发送多少数据进行流量控制避免因发送方发送数据过多导致接收方接收缓冲区溢出而导致的丢包MTU最大传输单元链路层根据物理硬件限制的最大数据帧大小包含报头在内若一个报文特别大UDP数据最大长度64k-8但是受限于链路层MTU限制在网络层就会被分片分割成多个小的数据帧传输TCP在传输的时候在三次握手阶段就会协商MSS(传输层TCP控制的最大数据段大小)MSSMTU-IP报头大小-TCP报头大小双方会在TCP选项数据中携带自己所支持的MSS大小选择其中较小值作为实际的MSS传输大小往后数据发送都会以该大小进行发送窗口大小字段用于告诉对方本方的接收缓冲区的剩余空闲空间大小。发送端会有一个发送窗口发送窗口的大小 接收端的窗口大小字段并且窗口的位置会随着发送端数据的发送和接收到接收端对数据的确认而不断的向右滑动这个窗口称之为滑动窗口。发送方通过窗口控制自己要发送的数据量接收方通过窗口控制自己接收数据的位置3拥塞控制机制拥塞控制机制发送方在本地通过维护的一个拥塞窗口变量用于控制当前发送方所能发送的数据量避免因为网络状态不好出现丢包发送方又不断大量重传导致网络更加拥塞的情况拥塞窗口描述了当前发送方可以发送多少数据拥塞窗口滑动窗口大小拥塞窗口变化机制慢启动、快增长指数增长通过这种方式进行网络状态探测收到快速重传请求阈值不变窗口变为当前窗口大小的一半重新开始探测出现了超时重传阈值将为当前窗口的一半窗口降至1重新开始探测TCP为了实现可靠传输牺牲了很多的性能那么为了尽可能地避免性能上地损失提出了一些机制快速重传机制快速重传协议避免超时等待延迟应答机制接收方收到数据后并不会立即给与确认回复可能会进行一个延迟节省一部分的确认回复捎带应答机制接收方收到数据后如果刚好当前需要给对方发送数据就会把确认回复和要发送的数据合并到一起进行发送节省确认回复所导致的空报文传输。因为确认回复就是协议中的确认序号延迟发送机制发送方send将数据放到发送缓冲区之后并不会立即发送数据而是会延迟一点时间将大量的小数据攒成大数据再通过一次IO实现传输停等机制、回退n步机制、选择重传机制....3.面向字节流字节流传输以字节为单位进行先进先出的传输方式TCP的粘包问题场景发送方可能会将多次send的数据当作一条报文进行发送接收方可能会将多条数据当作一条recv交付给应用层原因TCP并不会对数据在缓冲区中进行边界管理解决方案TCP没有在传输层进行数据边界管理但是程序员可以在应用层进行边界管理方案一使用特殊字符给数据中增加结尾表示缺点容易与数据中的特殊字符产生二义性解决对数据中的特殊字符进行转义处理方案二使用固定长度传输数据缺点容易造成资源浪费且必须明确最大数据长度方案三最常用自定制LV通信协议实现边界标记使用固定长度的长度字段描述数据长度接收方先接收指定长度的长度字段根据长度字段的值获取数据LlengthVvalueTCP实现字节流传输所带来的阻塞特性当recv接收数据的时候接收缓冲区中没有数据则会阻塞当send发送数据的时候发送缓冲区中数据满了则会阻塞当连接断开的时候或对端关闭了写操作recv接收完缓冲区数据后继续recv则不再阻塞返回0当连接断开的时候或对端关闭了读操作send发送数据就会触发异常

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑