
深入理解Linux网络
文章平均质量分 94
计算机网络
得过且过的勇者y
万丈高楼平地起,勿在浮沙筑高台
展开
-
深入TCP协议——tcp_tw_reuse和tcp_tw_recycle
我们已经知道TCP四次挥手中,主动方在收到被动方的FIN数据包之后会进入TIME_WAIT状态等待2MSL的时间后才进入CLOSED。在 Linux 操作系统下,TIME_WAIT 状态的持续时间是 60 秒,这意味着这 60 秒内,客户端一直会占用着这个端口,这是有一定的开销的。如果如果主动关闭连接方的 TIME_WAIT 状态过多,占满了所有端口资源,则会导致无法创建新连接。原创 2023-07-20 20:24:38 · 6166 阅读 · 0 评论 -
深入理解Linux网络——TCP协议三次握手和四次挥手详细流程
并且假如说节省第二次挥手的ACK包,那么因为下一个FIN的时间是不确定的,有可能很久,那么实现的时候得让FIN_WAIT_1等待一个很久的时间。如果是发生了如网络错误、断线或程序崩溃等错误或异常,那么自己这边的系统可能关闭所有的网络接口,释放所有的网络相关的内存等(取决于操作系统和协议栈的实现),而对端发送的保活数据包将接收不到ACK,重试几次后,就会进行连接的关闭,这个时候是不会进行四次挥手的。:等到一定时间后收不到服务端的反馈的时候来开启重传。每次超时时间为2的指数递增(1,2,4,8,16,32)原创 2023-07-20 17:49:40 · 941 阅读 · 0 评论 -
深入理解Linux网络——TCP连接的开销
*NUMA是一种针对多处理器系统的内存架构,其主要思想是将物理内存划分为多个节点,每个处理器可以直接访问所有的内存,但访问不同节点的内存的延迟和带宽可能会有所不同。**dentry对象的申请最终同样是是调用到了kmem_cache_alloc函数(对应的slab缓存dentry在内核初始化时的dcache_init中创建的),而file对象的申请最终是调用了kmem_cache_zalloc函数进行分配(对应的slab缓存flip是在内核初始化时的files_init中创建的)原创 2023-07-18 19:52:22 · 1863 阅读 · 0 评论 -
深入理解Linux网络——TCP连接建立过程(三次握手源码详解)
icsk->icsk_accept_queue定义在inet_connection_sock下,是一个request_sock_queue类型的对象,是内核用来接收客户端请求的主要数据结构。我们平时说的全连接队列、半连接队列全都是在这个数据结构里实现的。我们来看具体的代码。// 全连接队列 struct request_sock * rskq_accept_head;// 半连接队列 struct listen_sock * listen_opt;原创 2023-07-15 21:03:27 · 2803 阅读 · 0 评论 -
深入理解Linux网络——本机网络IO
上面路由表中10.143.x.y dev eth0是本机的局域网IP,虽然写的是dev eth0,但是其实内核在初始化local路由表的时候,把local路由表里所有的路由项都设置为了RTN_LOCAL。:__netif_receive_skb => __netif_receive_skb_core => deliver_skb,然后再将数据送入ip_rcv中进行后续操作。查找路由项的函数时ip_route_output_ports,它经过层层调用,来到关键的部分——fib_lookup。原创 2023-07-12 18:20:33 · 1421 阅读 · 0 评论 -
深入理解Linux网络——内核是如何发送网络包的
调用dma_map_single函数创建内存和设备之间的DMA映射,tx_ring->dev是设备的硬件描述符,即网卡,skb->data是要映射的地址,size是映射的数据的大小,即数据包的大小,DMA_TO_DEVICE是指映射的方向,这里是数据将从内存传输到设备,返回的调用结果是一个DMA地址,存储在dma变量中,设备可以直接通过这个地址访问到skb的数据。这种设计的好处是,对于大的数据包,可以将其数据负载部分存储在分页区,避免对大块连续内存的分配,从而提高内存使用效率,减少内存碎片。原创 2023-07-12 01:41:34 · 3405 阅读 · 1 评论 -
深入理解Linux网络——内核与用户进程协作之多路复用方案(epoll)
epoll就是其中最优秀的实现方式,其提供了以下几个相关的函数:在用户进程调用epoll_create的时候,内核会创建一个struct eventpoll的内核对象,并把它关联到当前进程的已打开文件列表中。eventpoll的定义如下:wq:等待队列链表。软中断数据就绪的时候会通过wq来找到阻塞在epoll对象上的用户进程rbr:一棵红黑树,为了支持对海量连接的高效查找、插入和删除,eventpoll内部使用了一棵红黑树。通过这棵树来管理用户进程下添加进来的所有socket连接rdllist:就绪原创 2023-07-10 01:30:54 · 859 阅读 · 0 评论 -
深入理解Linux网络——内核与用户进程协作之同步阻塞方案(BIO)
我们自己的代码所在的进程:我们调用的socket()函数会进入内核态创建必要的内核对象。recv()函数会在进入内核态以后负责查看接收队列,以及在没有数据可以处理的时候把当前进程组色调,让出CPU。硬中断、软中断上下文:在这些组件中,将包处理完后会放到socket的接收队列中,然后根据socket内核对象找到其等待队列中正在因为等待而被阻塞掉的进程,将它唤醒。每次一个进程专门为了等待一个socket上的数据就被从CPU上拿出来,然后换上另一个进程。原创 2023-07-09 18:24:56 · 975 阅读 · 0 评论 -
深入理解Linux网络——内核是如何接收到网络包的
数据到来后的处理:1. 数据进入网卡Rx FIFO,通过DMA写入内存的RingBuffer,向CPU发起硬中断2. CPU响应硬中断,调用网卡启动时注册的中断处理函数3. 中断处理函数中将驱动传来的poll_list添加到CPU对应的softnet_data的poll_list,发起软中断4. 内核线程ksoftirqd发现软中断请求,关闭硬中断5. ksoftirqd线程根据软中断类型选择处理函数,调用驱动的poll函数收包6. poll函数摘下RIngBuffer上的skb,发到协议栈原创 2023-07-08 00:08:57 · 4180 阅读 · 6 评论 -
网络互联设备(集线器、交换机、路由器)
网桥(Bridge)工作在OSI模型的数据链路层,连接两个局域网,在各种传输介质中转发数据信号,扩展网络的距离,有效地限制两个介质系统中无关紧要的通信,选择性地转发数据帧,减少不必要的网络流量。由于交换机对多数端口的数据进行同时交换,这就要求具有很宽的交换总线带宽,如果二层交换机有N个端口,每个端口的带宽是M,交换机总线带宽超过N×M,那么这交换机就可以实现线速交换;另外,工作在数据链路层或更高层的设备如网桥、交换机、路由器等等,由它们连接起来的两组设备仍然分别处于各自独立的物理层,因此是两个网段。原创 2023-07-05 13:44:30 · 7483 阅读 · 0 评论 -
IP路由协议(RIP、IGRP、OSPF、IS-IS、BGP)
它首先检查的是掩码位数最长的,如果有32位掩码的路由条目,则这条路径会被优先检查,其次是24位、16位等等;三层交换方案通常在核心层使用三层交换机,汇聚层使用二层交换机,来自不同VLAN的信息流在二层交换机上汇聚,通过三层交换机相连的Trunk链路,在三层交换机实现路由,并转发给目的主机。OSPF有五种报文类型,每个OSPF包都具有OSPF数据包报头,IP包头中,协议字段为89,代表OSPF,组播地址=224.0.0.5或224.0.0.6。在实际的网络组建中会出现普通区域没有直接的链路和主干区域连接。原创 2023-07-02 16:57:06 · 4004 阅读 · 1 评论 -
路由协议基本术语
路由协议基本术语:自治系统、外部网关协议、内部网关协议、度量标准和度量值、管理距离、路由协议和路有环路问题原创 2023-07-01 20:14:26 · 619 阅读 · 0 评论 -
使用FileZilla搭建公网访问的ftp服务器(Frp/花生壳)
FTP客户端使用N(N>1023)端口连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器,服务器在本地开放一个端口(1024以上),然后把开放的端口告诉客户端,客户端再通过N+1端口连接到服务器开放的端口进行数据传输。即如果自己有公网ip则可以使用frp自己设置开放哪个端口进行数据通信,没有的话则用花生壳这样的工具提供的公网和分配的端口,得到端口和公网地址之后再返回去filezilla中设置ip和端口。...原创 2022-07-23 16:08:09 · 5709 阅读 · 0 评论 -
使用frp端口映射实现内网穿透(SSH、HTTP服务)
可以将内网服务以安全、便捷的方式通过具有公网IP节点的中转暴露到公网)进行内网穿透。custom_domains=这里填写你已经解析到frps服务端IP上的域名,自己每个穿透对应服务,都可以绑定一个专属域名用于访问,包括使用tcp和udp协议,然后就可以通过这个已经自定义域域名访问到自己的对应HTTP服务。vhost_http_port=7600和vhost_https_port=7601表示将服务器的7600端口做为http服务的访问入口,7601端口做为https服务的访问入口。......原创 2022-07-18 18:52:58 · 8040 阅读 · 1 评论 -
内网穿透的原理和实现方式
内网穿透也成NAT穿透,进行NAT穿透是为了使具有某一个特定源IP地址和源端口号的数据包不被NAT设备屏蔽而正确路由到内网主机。 主机A有公网IP,主机B位于NAT之后,有一个内网IP。由于主机A有公网IP,所以主机B可以直接通过TCP连接到主机A,而主机A则无法直接向主机B发起连接。这时需要一个共有服务器辅助进行内网穿透,A、B主机同时向服务器发起登录请求,并保持一个TCP或UDP连接。服务器记录其IP地址和端口后(服务器对主机B的记录是起经过NAT映射之后的IP和端口号)。当主机A想连接主机B,首先向原创 2022-07-08 20:24:58 · 4372 阅读 · 1 评论