小林coding 计算机网络
文章平均质量分 69
冲冲冲
陈岂几真幸运
冲冲冲
展开
-
简单、高效的通信机制eventfd
eventfd`是Linux内核为用户空间程序提供的一个轻量级事件通知机制。它主要用于代替更为复杂、重量级的通知方式,如管道(pipe)等,从而为跨线程或进程间通信提供了一个简单、高效的方式。initval:计时器初始值 flags:设置下面是`eventfd`的基本原理和工作机制:1. 创建:使用`eventfd`系统调用创建一个`eventfd`对象时,内核会返回一个文件描述符。这个文件描述符可以用来进行读写操作。2. 计数器:与每个`eventfd`相关联的是一个64位的无符号整数作为。原创 2023-09-04 15:20:03 · 115 阅读 · 0 评论 -
4.22 TCP 四次挥手,可以变成三次吗?
当发送没有携带数据的 ACK,它的网络效率也是很低的,因为它也有 40 个字节的 IP 头 和 TCP 头,但却没有携带数据报文。为了解决 ACK 传输效率低问题,所以就衍生出了TCP 延迟确认。当有响应数据要发送时,ACK 会随着响应数据一起立刻发送给对方当没有响应数据要发送时,ACK 将会延迟一段时间,以等待是否有响应数据可以一起发送如果在延迟等待发送 ACK 期间,对方的第二个数据报文又到达了,这时就会立刻发送 ACK。原创 2023-08-27 17:01:16 · 851 阅读 · 0 评论 -
4.21 用了 TCP 协议,数据一定不会丢吗?
此时目的机器的网卡会通知DMA将数据包信息放到RingBuffer中,再触发一个硬中断给CPU,CPU触发软中断让ksoftirqd去RingBuffer收包,于是一个数据包就这样顺着物理层,数据链路层,网络层,传输层,最后从内核空间拷贝到用户空间里的聊天软件里。建立TCP连接的两端,发送端在发出数据后会等待接收端回复ack包,ack包的目的是为了告诉对方自己确实收到了数据,但如果中间链路层发生了丢包,那发送端会迟迟收不到确认ack,于是就会进行重传。,告诉发送端,"球球了,顶不住了,别发了"。原创 2023-08-27 16:40:08 · 157 阅读 · 0 评论 -
4.19 & 20
服务端如果只 bind 了 IP 地址和端口,而没有调用 listen 的话,然后客户端对服务端发起了连接建立,服务端会回 RST 报文。是可以的,客户端是可以自己连自己的形成连接(TCP自连接),也可以两个客户端同时向对方发出请求建立连接(TCP同时打开),这两个情况都有个共同点,就是没有服务端参与,也就是没有listen,就能建立连接。执行 listen 方法时,会创建半连接队列和全连接队列,三次握手的过程中会在这两个队列中暂存连接信息。客户端没有执行listen,因为半连接队列和全连接队列都是在执行原创 2023-08-26 22:50:30 · 362 阅读 · 0 评论 -
4.18 TCP 和 UDP 可以使用同一个端口吗?
因为「监听」这个动作是在 TCP 服务端网络编程中才具有的,而 UDP 服务端网络编程中是没有「监听」这个动作的。TCP 和 UDP 服务端网络相似的一个地方,就是会调用 bind 绑定端口。原创 2023-08-26 22:22:12 · 1010 阅读 · 0 评论 -
4.17 如何基于 UDP 协议实现可靠传输?
其实就是接收窗口的对头阻塞问题,接收方收到的数据必须是在接收窗口范围内,如果收到超过窗口范围的数据就丢弃数据,当接收窗口收到有序数据时,接收窗口才能往前滑动,然后那些已经接收并且被确认的「有序」数据就可以被应用层读取。当接收窗口收到的数据不是有序的,比如收到第 33~40 字节的数据,由于第 32 字节数据没有收到, 接收窗口无法向前滑动,那么即使先收到第 33~40 字节的数据,这些数据也无法被应用层读取的。原创 2023-08-26 22:05:10 · 646 阅读 · 0 评论 -
4.16 TCP 协议有什么缺陷?
如果序列号较低的 TCP 段在网络传输中丢失了,即使序列号较高的 TCP 段已经被接收了,应用层也无法从内核中读取到这部分数据。TCP 是在内核实现的,所以 TLS 是无法对 TCP 头部加密的,这意味着 TCP 的序列号都是明文传输,所以就存安全的问题。基于 TCP 传输协议的 HTTP 协议,由于是通过四元组(源 IP、源端口、目的 IP、目的端口)确定一条 TCP 连接。),才能进行HTTP数据传输,这在一定程序上增加了数据传输的延迟。实现,如果要想升级 TCP 协议,那么只能升级内核。原创 2023-08-26 21:37:49 · 1136 阅读 · 0 评论 -
4.15 TCP Keepalive 和 HTTP Keep-Alive 是一个东西吗?
HTTP 的 Keep-Alive 也叫 HTTP 长连接,该功能是由「应用程序」实现的,可以使得用同一个 TCP 连接来发送和接收多个 HTTP 请求/应答,减少了 HTTP 短连接带来的多次 TCP 连接建立和释放的开销。TCP 的 Keepalive 也叫 TCP 保活机制,该功能是由「内核」实现的,当客户端和服务端长达一定时间没有进行数据交互时,内核为了确保该连接是否还有效,就会发送探测报文,来检测对方是否还在线,然后来决定是否要关闭该连接。原创 2023-08-26 09:54:53 · 1227 阅读 · 0 评论 -
4.14 HTTPS 中 TLS 和 TCP 能同时握手吗?
常规的TCP传输协议通信需要先建立TCP三次握手后才可以传输数据,前两次握手是不可携带数据的,第三次握手可以携带数据,因为这个时候客户端进入ESTABLISHED,表明客户端一方已经完成了TCP连接建立。TCP Fast Open 是为了绕过 TCP 三次握手发送数据,这个功能可以减少 TCP 连接建立的时延。要使用 TCP Fast Open 功能,客户端和服务端都要同时支持才会生效。开启了TCP Fast Open功能,想要绕过TCP三次握手发送数据,还是需要事先建立一次三次握手。原创 2023-08-26 09:43:20 · 1453 阅读 · 0 评论 -
4.14 tcp_tw_reuse 为什么默认是关闭的?
开启 tcp_tw_reuse 参数可以快速复用处于 TIME_WAIT 状态的 TCP 连接时,相当于缩短了 TIME_WAIT 状态的持续时间。原创 2023-08-26 00:14:34 · 1559 阅读 · 0 评论 -
4.12 TCP 连接,一端断电和进程崩溃有什么区别?
TCP 保活机制需要通过 socket 接口设置 选项才能够生效 定义一个时间段,如果在这个时间段内(保活时间7200s,俩小时),没有任何连接相关的活动,启动TCP保活机制开始每隔一个时间段(75秒)发送一个探测报文,如果连续几个(9次)探测报文都没有得到响应,则认为TCP连接已经死亡。没开TCP keepalive的情况下,客户端宕机,服务端无法感知到客户端状态服务端的 TCP 连接将会一直处于 ESTABLISHED 连接状态,直到客户端重启。在没有使用 TCP 保活机制且双方不传输数原创 2023-08-25 23:20:46 · 1274 阅读 · 0 评论 -
4.10&11
如果FIN报文比数据包先道道客户端,此时FIN是一个乱序报文,此时客户端的TCP连接并不会从FIN_WAIT_2状态转到TIME_WAIT状态。,因为处于 TIME_WAIT 状态的连接收到 SYN 后,会判断 SYN 的「序列号和时间戳」是否合法,然后根据判断结果的不同做不同的处理。收到合法的SYN后,就会重用此四元组连接,跳过2MSL转变为SYN_RECV状态,接着就能进行建立连接过程。收到非法的SYN后,处于 TIME_WAIT 状态的连接收到「非法的 SYN 」后,就会。乱序FIN会放到乱序队列,原创 2023-08-25 22:54:35 · 256 阅读 · 0 评论 -
4.8 SYN什么时候被丢弃
tcp_timestamps 选项开启之后, PAWS 机制会自动开启,它的作用是防止 TCP 包中的序列号发生绕回。每个TCP包都会有自己唯一的SEQ,出现TCP数据包重传的时候会复用SEQ号,这样接收方能通过SEQ号来判断数据包的唯一性,但是SEQ号是有限的,一共32bit,seq号是递增的,满了就从0开始。seq号溢出后就无法通过seq号标识数据包的唯一性,某个数据包延迟或因重发而延迟时,可能导致连接传递的数据被破坏。原创 2023-08-25 21:45:13 · 219 阅读 · 0 评论 -
4.7 为什么 TCP 每次建立连接时,初始化序列号都要不一样呢?
客户端和服务端的初始化序列号都是根据计数器底层的随机数,随机生成的,能很大程度上避免历史报文被下一个相同的四元组的连接接收,然后有引入时间戳机制,从而完全避免历史报文被连接接收的问题。增加时间戳的大小,由32 bit扩大到64bit将一个与时钟频率无关的值作为时间戳,时钟频率可以增加但时间戳的增速不变。原创 2023-08-25 15:00:54 · 83 阅读 · 0 评论 -
4.6 TCP面向字节流
我们可以自定义一个消息结构,由包头和数据组成,其中包头包是固定大小的,而且包头里有一个字段来说明紧随其后的数据有多大。原创 2023-08-25 11:37:40 · 1045 阅读 · 0 评论 -
4.5 TCP优化
主动方优化,关闭连接的方式通常有两种,分别是 RST 报文关闭和 FIN 报文关闭。原创 2023-08-24 19:10:36 · 833 阅读 · 0 评论 -
4.4TCP半连接队列和全连接队列
半连接队列,也称 SYN 队列;全连接队列,也称 accept 队列;服务器接收到客户端SYN的时候,内核会将该连接放入半连接队列,并向客户端发送ACK+SYN,接着客户端会返回ACK,服务端收到第三次握手的ACK后内核会把连接从半连接队列中移除,然后创建新的完全的连接并将其添加到accept队列,等待进程调用accept函数时把连接取出来。不管是半连接队列还是全连接队列,都有最大长度限制,超过限制时,内核会直接丢弃,或返回 RST 包。原创 2023-08-23 21:02:31 · 515 阅读 · 0 评论 -
WebSocket
WebSocket在服务器和客户端之间提供低延迟、全双工和长期运行的连接。全双工:通信的两个参与方可以同时发送和接收数据,不需要等待对方的响应或传输完成。通过建立全双工的持久连接,客户端和服务器之间就能实现高效实时性更强的通信。WebSocket的出现就是为了解决实时通信的问题。原创 2023-08-07 10:07:09 · 2042 阅读 · 0 评论 -
Tcp的粘包和半包问题及解决方案
①:发送方每次写入数据<内核缓冲区大小;导致多个小的数据包一次性放到一个缓冲区中一起发送了,接收端接收到数据就对导致粘包。Tcp接收数据的三个队列并不是实时的,有可能会延时,可能会导致读到多个消息,粘包了。(比如规定每10个字节表示一个消息,但是客户端发送的一个消息里只有1个字节那么剩下的字节就是浪费的,需要补空或者补0)缺点:数据内容长度有限制,需要提前知道可能的最长的消息的字节数。缺点:数据内容本身出现分隔符时,需要转义,所以需要扫描内容。②:发送方数据大小大于MTU,必须拆包。原创 2023-08-03 23:33:45 · 1235 阅读 · 0 评论 -
IP知识点
TCP/IP网络通信时,为了保证正常通信,每个设备都需要配置正确的IP地址。IP 地址(IPv4 地址)由32位正整数来表示,IP 地址在计算机是以二进制的方式处理,采用点分十进制的标记方式。最大允许43亿台计算机连接到网络,IP地址根据网卡数据配置的,服务器、路由器是由2个以上的网卡,也就是说会有两个以上的IP地址。43亿IP是不够用的,引入NAT技术,使得连接最大数可以超过43亿。原创 2023-07-14 19:39:55 · 68 阅读 · 0 评论 -
ICMP协议
ICMP协议是在IP协议的基础上实现的,它使用IP数据包进行传输,具有较低的开销和延迟。(Internet Control Message Protocol)互联网控制报文协议,所谓控制,就是通过下发指令来感知和控制网络环境,所以它一定是配合一个无法感知网络环境的协议来工作的,这个协议就是 IP(包括 IPv4 和 IPv6)。,它封装在 IP 层中,使用 IP 协议进行传输。因此,严格来说,ICMP 既不是一个网络层协议,也不是一个传输层协议,而是介于两者之间的一个协议。原创 2023-05-17 12:04:06 · 114 阅读 · 0 评论 -
Ping的原理
Ping的底层原理依赖于ICMP协议和网络协议栈的实现,通过发送特定类型的消息并解析目标主机的响应来测试主机之间的连通性和延迟。Ping的结果可以用于网络故障排除、网络性能测试以及判断目标主机是否可达等应用。Ping 是工作在 TCP/IP 网络体系结构中应用层的一个服务命令,一般来说,ping 可以用来检测网络通不通。它是基于ICMP协议工作的。对比目标地址,和自己本机的 MAC 地址是否一致。,测试目的站是否可达及了解其有关状态。机器 B 的 IP 地址为目标地址。计算出往返时间(RTT)原创 2023-05-17 10:48:43 · 102 阅读 · 0 评论 -
linux和window文件传输工具
linux与window文件传输原创 2023-05-09 23:32:44 · 161 阅读 · 0 评论