传输层协议解析——UDP和TCP

2023-05-16

文章目录

    • 协议解析
    • UDP协议解析
      • 协议格式:
      • UDP协议特性:
    • TCP协议解析
      • 协议格式:
      • 协议特性:
        • 面向连接
          • 三次握手建立连接:
          • 四次挥手断开连接:
          • 保活机制
        • 可靠传输
    • 面向字节流
    • 编程影响
    • 总结

协议解析

协议格式
协议特性
编程影响

UDP协议解析

协议格式:

首先我们来看看udp在文件(/usr/include/netinet/udp.h)中是如何组织数据的:
在这里插入图片描述
可以观察到,一个完整的udp数据格式由下面几部分组成:
在这里插入图片描述

16位源端-对端端口:描述通信双方
16位报文长度:描述报文长度。
	由于它是16位的,最多也是一个1111 1111 1111 111,即最大为65535
	也就决定了,udp长度不能超过64k,一个udp报文的长度最多不能超过 64k-8 
16位校验和:用于校验接收的数据是否与发送的数据完全一致
	二进制反码求和算法:
		①将报文的每个字节取反相加,得到一个数。这个数就是校验和。在计算之前,校验和默认为0,计算之后将这个数放进去。 
		②对端收到udp数据之后,对报文从头到尾进行二进制反码求和,如果这个数是0即认为收到的数据和发送的数据是一样的。
		③报文每个字节加起来的数字总有大于65535的时候,而校验和是16位2字节的整形,意味着有字节越界了,这时,将高位月结的字节数截取出来,在与低16为相加

UDP协议特性:

无连接,
不可靠,
面向数据报
解析:

SOCK_DGRAM   Supports datagrams (connectionless, unreliable messages of a fixed maximum length).
无连接:通信时不需要进行连接,只要知道对方的ip地址就可以发送数据
不可靠:不保证数据有序、安全到达接收方
面向数据报:有最大长度限制,并且是整条交付
	体会整条交付:udp数据接收时,对头部进行解析,得到要取的数据为数据报长度-8,这时就会去缓冲区中取这么多数据。

编程影响:
传输层协议的特性,影响着应用层的操作方式。这需要我们程序员针对传输层不同协议的特性,来制定特定的数据传输方式。

影响:
如果应用层要发送的数据过大(超过64k),就需要在应用程进行分包操作,将数据分成一个一个64k以内大小的包,按顺序传输
如果上层进行了分包操作,数据在传输的时候,由于网络原因或者其他原因,有可能造成后来的数据先到了,缓冲区数据混乱,为了避免这种情况,传输层就需要对数据进行包序管理
接收方recvfrom的接收缓冲区也要足够大,至少要能完整取出一条数据

TCP协议解析

传输控制协议

协议格式:

在/usr/include/netinet中打开tcp.h发现里面包含的数据很多,大概能看到的是它使用条件编译,对TCP头部做出了很多解释,我们来画图理解一下TCP的大概组成:
在这里插入图片描述

16位源端-对端端口:描述通信两端
32位序号-32位确认序号:用于实现包序管理
4位报头长度:以4个字节为单位,4位表示最大数字15,
	报头长度为1表示有4个字节,2表示8个字节
	15x4=60,即报头长度最大60个字节
	若没有数据,一个tcp报文也有上图的前5行的内容,共有20个字节
	即TCP报头长度最少20个字节,最多60个字节
6位保留
6位标志位:用于标注当前报文的类型
	URG:紧急指针有效位,表示紧急指针字段有没有效
	ACK:确认应答报文
	PSH:告诉对端数据应该尽快被取出,不在缓冲区中排队
	RST:重置连接,用于复位出错的连接,拒绝非法数据访问
	SYN:建立连接请求标志位
	FIN:断开连接请求标志位
16位窗口大小:用于实现滑动窗口机制,进行流量控制
16位校验和:校验数据一致性
16位紧急指针:表示带外数据的位置,带外数据一般需要立即处理
0~40字节选项数据:

协议特性:

面向连接
可靠传输
面向字节流
解析:

面向连接:通信双方建立连接之后才能进行通信
		确保通信双方都有收发数据的能力

面向连接

三次握手建立连接:

在讲套接字时,说到服务端发送连接请求,服务端监听套接字接收到请求之后,创建新的套接字获取新建连接。
我们来画图细致描述一下这个过程:
在这里插入图片描述
问题:
为什么是三次握手,而不是两次或四次?
总结:两次不安全,四次没必要。
前提:建立连接是建立在通信双方都知道对方具有数据收发能力的基础上的。
服务端第一次接收到客户端的SYN报文之后,不能确定客户端是否具有数据收发能力的原因是:预防客户端发送一个请求就没影了。所以必须再发送SYN获取对方的状态。这一步必不可少。(问什么不能两次)
四次的情况就是服务端ACK和SYN分别发送,我们知道发送请求实际上是发送报文头,每一个报文头中都有各种报文类型标志位,只需要将对应的标志位置1就是发送对应请求了。完全可以在一个报文中将ACK和SYN对应位置1即可。(四次没必要)
握手失败是怎么处理的?
SYN泛洪攻击:有一种网络攻击手段就是这种泛洪攻击,同一时间向服务端发送很多SYN请求却不建立连接,希望导致服务端资源耗尽崩溃。
TCP针对这种攻击的处理方式就是,
1、我等待超时就发送RST重置连接,释放资源,要想再连接你就重新发送请求。
2、防火墙,如果同一时间收到来自相似ip的很多请求,就把这个ip加入黑名单,不接受来自这个ip的连接请求。
失败情况和默认处理:
第一次握手失败:第一次客户端发送的SYN请求丢包,服务端不需要有什么处理,因为就没有感知到有人传来请求,客户端的处理方式是:过一段时间之后重传。
第二次握手失败:服务端收到客户端的SYN请求,进行ACK和SYN回复丢包。这种情况两边都受影响,我们分别说说客户端和服务端的处理方式:
若这个ACK+SYN请求丢失,

  • 客户端等待第二次握手超时,就会怀疑,是不是我第一次握手发送的SYN请求丢失了。就重新向服务端发送SYN请求进行第一次握手。
  • 服务端等待第三次握手超时,会怀疑这个客户端是不是恶意攻击。这时就不会重新发送ACK+SYN请求,而是等待超时之后向客户端发送RST重置连接报文,关闭新建的套接字释放资源。如果你还想跟我建立连接就重新请求吧。

第三次握手失败:第三次握手客户端回复的ACK丢失,只会影响服务端,就是服务端等待超时。处理方式就是向客户端发送RST重置连接报文,关闭套接字释放资源。

四次挥手断开连接:

在理解TCP通信断开连接之前,我们来了解一个接口:

close(sockfd)  关闭读写端并释放资源
shutdown(int sockfd,int how)  按照指定方式关闭socket断开连接
socked 套接字操作句柄
how
	SHUT_RD  关闭读端	SHUT_WR  关闭写端	SHUT_RDWR  关闭读写端

画图理解过程:
在这里插入图片描述
为什么挥手要四次?
首先我们需要知道,上层调用到close才会发送FIN包。主动关闭方调用到close发送FIN包,有可能被动关闭方还没有调用到close,还有可能要发送数据,所以FIN只能是确定自己不再发送数据了,而必须还要具有接收来自对方数据的能力。
主动关闭方调用到close/shutdown发送FIN断开连接请求,表示不再发送数据。被动关闭方收到之后发送ACK确认回复。
当被动关闭方上层调用到close/shutdown,才会向主动关闭方发送FIN包,表示我也不再发送数据了。
ACK回复之后,双方都不再发送数据,就没有通讯的必要了,通讯就结束了,此时就可以断开连接。
因此默认的是被动关闭方发送ACK包和FIN包需要独立进行。

四次挥手过程中的状态分析:
在这里插入图片描述

一台主机上出现了大量的CLOSE_WAIT状态连接是什么原因,是如何解决的?
一台主机接收到FIN包,进行ACK回复之后,状态就会置为CLOSE_WAIT,等这台主句做完自己的事情遇到close/shutdown向对方发送FIN包,才会将状态置为LAST_ACK。
因此出现大量CLOSE_WAIT的原因就是,收到FIN包发送了ACK但是一直没有调用到close发送FIN包,很有可能就是代码中没有对连接断开的套接字进行close操作。
解决方案就是:检查代码是否出现问题。
TIME_WAIT状态有什么用?
主动关闭方在收到对方的FIN包之后,进行最后一次回复之后就会进入TIME_WAIT状态。
/假设主动关闭方最后一次回复的ACK丢失,导致的结果就是被动关闭方接收不到这个ACK,被动关闭方就会怀疑是不是对方没有接收到我上面发的FIN包。处理的方式就是,重新发送FIN包等待回复。因为一些原因这个FIN包只会重传一次。/
假设主动关闭方在回复最后一次ACK之后没有进行TIME_WAIT而是直接关闭套接字释放资源,之后又有新建的套接字占用了这个刚刚关闭的IP和端口,但是此时被动关闭方还是处于等待ACK状态,等待超时之后,就会向对端重新发送FIN断开连接。这种情况下,导致的一种可能就是,新建的套接字上来啥也没干就收到一个FIN包关闭连接请求,这不懵逼了。
而TIME_WAIT的作用就是等待这些有可能重传的FIN包。
TIME_WAIT等待2MSL个时间,MSL(Maximum Segment Lifetime)就是报文最长存活时间,就是等待这两个报文重传FIN和重传回复ACK。确保本次通信的数据都消失在网络中。

一台主机上大量出现TIME_WAIT连接,是什么原因,如何解决?
TIME_WAIT是主动发关闭方收到FIN请求最后一次发送ACK回复之后的状态,一台主机大量出现TIME_WAIT原因就是大量主动关闭套接字,常见于爬虫客户端主机。
解决方案就是:
1.将TIME_WAIT等待时间设置更短
2.设置套接字选项,开启地址复用

int setsocketopt(int fd,int level,int optname,int* optval,int* optlen)
		level:SOL_SOCKET
		optname: SO_REUSEADDR   设置地址复用
常用于服务端,由于一个端口两个套接字,复用之前需要考虑一个数据发送过来到底是谁接收,主要就是解决由于关闭套接字出现TIME_WAIT

爬虫就是,打开一个连接,再打开很多其他连接,最终找到自己想要的连接,类似于我们在百度查找一个东西,不一定一次能找到,要找多次。

保活机制

使用TCP通信中,连接双方如果长时间没有进行数据通信,套接字的资源占用着就有点浪费,服务端每隔一段时间就会向客户端发送一条保活探测数据报,要求客户端回应,如果发送了多次都没有收到回复,服务端就认为连接断开,就会关闭套接字释放资源。
长时间:最晚一次通信后的7200s
每隔一段时间:75s
默认保活探测报文次数:9
以上数据为操作系统默认数据,可以使用setsocketopt()自定义设置
连接断开在上层的表现:recv返回0/send出发SIGPIPE异常

可靠传输

安全有效传输
保证数据可靠到达对端,并有序交付。

	面向连接:
		确保双方都有数据收发的能力
	确认应答机制:
		接收方对接收到的每条数据都要进行回复,发送方收到确认回复认为传输成功,否则认为数据丢包。
	超时重传机制:
		发送方等待超时没有收到确认回复,则对数据进行重传。
		默认等待200ms,但是是根据网络状况动态变化的,不固定
		时间太长?快速重传协议
	协议字段中的序号和确认序号:
		进行包序管理实现数据有序交付	
		seq:本条数据的起始序号
		ack:对方发送数据的确认序号,告诉对方自己接收到了数据
		seq、ack和ACK标志位不一样,总体过程大概就是:
			三次握手建立连接中,双方协商起始信号,确认信号就是起始信号加1
			数据通信阶段,确认信号是对方的起始序号加数据长度告诉对方该序号之前的数据已经全部接收到了。
	校验和字段:
		检验数据一致性,如果不一致,就丢弃数据,要求重传

避免无谓丢包

丢包:

通信中不可避免出现丢包的情况,常见的两种就是:
1.因为发送方发送数据过多,接收方来不及处理,缓冲区溢出时产生的丢包
2.因为网络状态不好产生的大量丢包
  1. 滑动窗口机制

    依赖于协议字段中的窗口字段实现,避免因为发送方发送数据过快,接收方来不及处理,缓冲区溢出之后产生的丢包。
    原理:接收方收到数据之后就会应答,这时候会通过窗口大小字段告诉发送方最多再给自己发送多少数据。
    大小:窗口大小不能大于接收缓冲区中剩余空间的大小
    实现:通信双方分别有维护一个发送窗口和接收窗口,
    	在三次握手阶段,双方通过数据包头会协商一个MMS最大报文段长度(MTU-40)。通讯双方发送一个自己能接受的最大报文长度,取其中较小的一个作为MMS
    	发送方窗口:记录发送方所能发送的数据大小和序号
    		后沿:发送起始信号,收到确认回复之后向前移动
    		前沿:结束发送序号(位置),根据窗口大小变化
    		前沿减后沿不能大于对方回复的窗口大小
    	接收方窗口:
    		后沿:接收起始序号,受到起始序号的数据向前移动
    		前沿:接受的结束序号,根据窗口大小和剩余缓冲区空间向前移动
    几种不同场景的丢包预防机制:
    	停等协议:发送数据之后,收到确认回复之后才会发送下一条。适应于网络状况极差的情况。
    	回退n步协议:哪一条数据丢了,从丢失的这一个数据开始,往后的数据全部重传。网络状况不好的情况下,丢失一条数据,有可能后续也有数据丢失了,为了方便,就回退n步重传。
    	选择重传协议:那条丢了就重传哪一条,适用于网络状况极好的场景
    
  2. 拥塞窗口机制

    解决因为网络状况不好产生的大量丢包
    原理:发送方维护了一个拥塞窗口,用于限制当前所能发送的数据量
    机制:慢启动,快增长的形式进行传输控制
    理解:就是每次发送数据的时候
    	第一次发送1条数据,收到回复,网络状态良好
    	第二次发送2条数据,收到回复,网络状态良好
    	第三次发送4条数据,收到回复,网络状态良好
    	第四次发送8条数据,收到回复,网络状态良好(发送数据的量呈指数增长)
    	第五次发送16条数据,收到回复,有三条没收到,网络状态不好。
    	第六次发送1条数据,收到回复,网络状态良好
    	第七次发送2条数据,收到回复,网络状态良好
    				…………
    网络良好时,发送数据的大小并不能无限增长,最大不能超滑动窗口大小,滑动窗口的大小是一个阈值
    

提高传输性能
TCP为了实现可靠传输,牺牲了传输性能,而在传输中,有些性能的损失是没有必要的。
下面介绍几种性能挽回方案:

  1. 快速重传协议:

    概念:在传输过程中,若接收方接收到的数据并非是接收窗口的前沿数据,则有理由认为该条数据丢失,这时每收到一条数据就会发送一个前·沿数据的重传请求,一旦发送方连续收到三条重传请求则直接对这块数据进行重传。
    作用:丢包后不用完全等待超时了,减少了丢包后的超时等待时间
    画图理解: 在这里插入图片描述
    为什么是三次之后重传? 三条是避免数据延迟到达情况,发了三条都没收到,就不考虑延迟了。

  2. 捎带应答机制:
    受确认应答机制的影响,接收方对收到的每一条数据都要进行确认回复,然而回复的最主要信息就是确认序号,每一条确认回复至少是一个空报头的传输。
    如果收到数据之后,刚好要给对方也发送数据,则将即将要发送的数据和确认回复放到一起进行发送。

  3. 延迟应答机制:
    接收方对接收的每一条数据都会进行确认回复,其中还
    包含当前的窗口字段大小,如果立即进行回复,窗口大小是不断减小的(前沿不动,后沿一直向前),
    因此延迟进行回复,有可能上层将数据取出,维持窗口大小(数据取出之后,前沿向前移动),通过这种方式保证传输吞吐量不会降低。

  4. 延迟发送机制
    tcp传输过程中,如果每次send的数据都直接封装报头进行发送,若发送的数据很小,但是次数比较多,就会增多IO次数,降低效率,这时没有必要的。
    所以延迟发送,将数据在发送缓冲区堆积起来,在合适的时候进行发送,减少了IO次数,提高效率。
    延迟发送由一种nagle算法支撑,是默认开启的,可以通过设置过套接字选项关闭的。关闭之后,send直接发送。

面向字节流

可靠的、有序的、双向的、基于连接的传输方式
	传输时,并不限制上次recv和send发送或接受的数据大小
优势:相较于面向数据报来说,传输更加灵活
缺陷:产生粘包问题
粘包问题:
	将多条数据当作一条数据进行处理
	产生本质原因:
			TCP发送端send发送数据的时候, 并不会将数据直接进行发送,而是先将数据放到发送缓冲区中,选择合适的时候从缓冲区中取出合适大小的数据进行封装发送。
			接收端recv接收数据的时候, 并不会一条一条的向上交付,而是会将接收到的数据放到接收缓冲区中取出指定长度的数据进行交付。
			而TCP并不会对边界进行处理,这就导致,有可能多条数据当作一条数据进行处理。这就是粘包问题。
	对比:udp接收方在接收数据时,将报头和数据一起放入缓冲区,从缓冲区中取出数据时,就可以对头部进行解析,取出特定长的数据。
	解决方案:
		程序员在应用层进行数据得边界管理,解决的方式有:
			特殊字符为间隔 - 缺点是数据中如果也有特殊字符就需要转义处理
			数据定长 - 缺点是大量传输短小数据时,需要填补空位,这是资源的的浪费。
			使用TLV格式数据
				很常见的格式。比如udp数据发送时将报头和数据一起放入接收缓冲区,http数据包头和数据一起放入缓冲区。
				就是在应用程设置TCP报头长度,取的时候先取出数据头部,根据头部里面的长度信息Content-Length再取出特定长度的数据。

编程影响

1.连接断开:recv返回0,send触发异常
recv一旦返回0,就要考虑套接字描述符的回收
send因为会触发异常导致程序退出,若不想退出就需要信号处理
2.tcp传输存在粘包问题,需要在应用层对数据进行边界管理。udp由于缓冲区中有报头,就不存在粘包问题。

总结

tcp协议与udp的区别:
实现上的差别:
特性上的差别:
应用上的差别:
tcp如何实现可靠传输?udp如何实现可靠传输?
tcp在传输层通过面向连接,确认应答机制,超时重传机制还有tcp报头校验和字段,序号和确认序号来实现数据安全有序到达接收方,通过滑动窗口机制和拥塞窗口机制避免丢包问题实现安全可靠传输。udp在传输层并没有实现可靠传输,如果需要使用udp进行可靠传输,就需要程序员在应用层对一些可靠传输方法进行实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

传输层协议解析——UDP和TCP 的相关文章

  • 如何将udp发送到udp node.js服务器?

    我对此很陌生 所以我真的不知道我在做什么 但我已经设置了一个 node js udp 服务器 我想从客户端 来自网站 向它发送一个数据包 但我不知道如何在 javascript 中做到这一点 或者是否可能 我不是在研究如何从 Node js
  • 建立 TCP 连接边界的正确方法

    我的问题是关于如何正确处理使用 tcp 连接接收的数据 事实上 通过建立 tcp 连接 创建了一个流 假设我想发送一条有开头和结尾的消息 由于数据在流中流动而没有指定任何边界 我如何识别消息的开始和结束 我想在消息的开头和结尾处放置一些特殊
  • 为什么SOCKS5需要通过UDP中继UDP?

    The SOCKS5 https en wikipedia org wiki SOCKS SOCKS5协议 描述为RFC1928 https www rfc editor org rfc rfc1928提供对 UDP 的支持 总而言之 希望
  • 错误号:11,资源暂时不可用

    我正在使用 c 套接字来实现可靠的 UDP 协议 我正在使用以下代码在等待确认的套接字上设置超时 我不确定为什么会收到 errno 11 资源暂时不可用 set timer for recv socket struct timeval tv
  • 了解 netty 通道缓冲区和水印

    我正在尝试了解网络缓冲区和水印 作为一个测试用例 我有一个 netty 服务器 它向客户端写入数据 客户端被阻止 基本上每次读取之间有 10 秒的睡眠时间 在正常 I O 下 如果接收方被阻塞 TCP 发送方将受到限制 由于流量控制 发送速
  • UDP接收和发送Matlab

    我目前正在努力从外部设备接收数据包 然后将数据发送到另一个设备 我有一个工作 Simulink 模型 但我不知道如何在 Matlab 中对其进行编码 Matlab 中 UDP 接收块的参数如下图所示UDP 接收参数 https i stac
  • 使用 IdTCPClient 和 IdTCPServer 发送和接收 TMemoryStream

    我在 XE2 中找到了 Remy Lebeau 的 IdTCP 组件聊天演示 我想玩一下 可以发现 我想使用这些组件发送图片 最好的方法似乎是使用 TMemoryStream 如果我发送字符串 连接工作正常 字符串传输成功 但是当我将其更改
  • 使用 InputStream 通过 TCP 套接字接收多个图像

    每次我从相机捕获图像时 我试图将多个图像自动从我的 Android 手机一张一张地发送到服务器 PC 问题是read 函数仅在第一次时阻塞 因此 从技术上讲 只有一张图像被接收并完美显示 但在那之后当is read 回报 1 该功能不阻塞
  • 使用 TCP 时是否需要使用校验和来保护我的消息?

    使用 TCP 作为网络协议 在通过线路发送消息之前 我会为每条消息的大小 以及可能的校验和 添加前缀 我想知道 计算和传输消息的校验和是否有意义 以确保消息将被不变地传递 如果以及何时传递 例如因为一些网络错误 目前 我在发送消息本身之前发
  • TCP 连接寿命

    客户端 服务器 TCP 连接在野外可以持续多长时间 我希望它保持永久连接 但事情发生了 所以客户端将不得不重新连接 我什么时候可以说代码有问题而不是某些外部设备有问题 我同意赞 林克斯的观点 虽然无法保证 但假设不存在连接或带宽问题 您可以
  • iPhone 上的 TCP 打洞

    我已经阅读了一些内容 虽然我是 iPhone 网络的新手 但我想知道 TCP 打孔是否可以通过 NAT 连接两台 iPhone 我还阅读了一些有关 uPnP 和发夹的有用内容 但我根本不熟悉这些内容 所以如果有人对这是否可能有任何想法 我的
  • 用 C 语言进行非阻塞 udp 套接字编程:我能得到什么?

    我在理解从非阻塞 UDP 套接字返回什么recv recvfrom 时遇到问题 与 TCP 相比更具体一点 如果我错了 请纠正我 阻塞套接字 TCP 或 UDP 在缓冲区中有一些数据之前不会从 recv 返回 这可以是一定数量的字节 TCP
  • Silverlight 套接字:模仿框架 Bind、Listen 和 Accept 方法?

    我有这个 NET Framework C 类 它实际上充当 TCP 连接的包装器Socket http msdn microsoft com en us library attbb8f5 aspxSystem Net Sockets 命名空
  • 使用 NestJS 的 TCP 服务器

    是否可以使用 NestJS 创建 TCP 服务器 我有一个仅通过 TCP 进行通信的 GPS 跟踪器 由于 NestJS 可以通过 TCP 在微服务之间进行通信 我认为也许 NestJS 可以用作低级网络应用程序 例如 java netty
  • 如何使用C从http下载文件?

    最近几天我试图弄清楚如何从 URL 下载文件 这是我对套接字的第一个挑战 我用它来了解协议 所以我想在没有 cURL 库的情况下只用 C 语言来完成它 我搜索了很多 现在我可以打印页面的源代码 但我认为这与文件不同 我不必只将接收到的数据从
  • 用于实时传输协议的开源 .net C# 库

    net中有好的RTP开源库吗 我的目的是用于音频和视频同步问题并提高每秒帧数速率 我对 RTP 不太了解 但你可能想看看本文 http www codeproject com KB IP Using RTP in Multicasting
  • 跨 NAT 的 UDP 客户端无法从服务器接收数据

    我正在尝试在服务器 在公共 IP 上 和客户端 跨 NAT 之间使用 UDP 进行双向通信 我的逻辑是 如果服务器将一些数据发送到 IP 和它接收数据包的端口 客户端仍然应该收到它 因为 NAT 将具有最终将数据包发送到客户端的映射 客户端
  • boost 是否有可移植的方式来使用 ntohl/htonl/ntohs/htons 类型函数?

    我正在使用 UDP 特别是 boost asio ip udp socket 套接字 如果有帮助的话 头文件是什么 我需要哪些标头 类来处理 UDP 提升下的网络字节排序 刚刚发现就足够了 include
  • 如何用单线程实现TCP上的全双工通道?

    我正在编写的网络库需要通过 TCP 套接字发送和接收消息 消息可以随时发送或接收 即应该作为全双工通道工作 我能够使用两个线程来实现这样的场景 调用 send 的主线程和一个主要在 receive 调用处阻塞的专用线程 我的问题是 是否可以
  • 通过 SO_RCVTIMEO 套接字选项在 Ruby 中设置套接字超时

    我试图通过 SO RCVTIMEO 套接字选项在 Ruby 中设置套接字超时 但它似乎对任何最近的 nix 操作系统都没有影响 使用 Ruby 的 Timeout 模块不是一个选择 因为它需要为每个超时生成和连接线程 这可能会变得昂贵 在需

随机推荐