![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
网络通信
文章平均质量分 63
Farmwang
博采众长,兼收并蓄!
展开
-
多网卡添加静态路由
route add 10.15.0.0 mask 255.255.0.0 10.21.189.129 -pIP地址+子网掩码 决定网络地址 10.21.189.129 是网关地址 后面加网关地址原创 2018-12-19 10:48:50 · 2467 阅读 · 0 评论 -
TCP选项之SO_LINGER
SO_LINGER这个选项在我以前带队改造haproxy的时候引出过一个reset(RST)客户端连接的bug。SO_LINGER作用设置函数close()关闭TCP连接时的行为。缺省close()的行为是,如果有数据残留在socket发送缓冲区中则系统将继续发送这些数据给对方,等待被确认,然后返回。利用此选项,可以将此缺省行为设置为以下两种 a.立即关闭该连接,通过发送转载 2017-03-16 19:46:51 · 1179 阅读 · 3 评论 -
TCP之异常关闭的意义
终止一个连接的正常方式是发送FIN。在发送缓冲区中所有排队数据都已发送之后才发送FIN,正常情况下没有任何数据丢失。但我们有时也有可能发送一个RST报文段而不是FIN来中途关闭一个连接。这称为异常关闭。进程关闭socket的默认方式是正常关闭,如果需要异常关闭,利用SO_LINGER选项来控制。异常关闭一个连接对应用程序来说有两个优点:(1)丢弃任何待发转载 2017-03-16 19:46:05 · 327 阅读 · 0 评论 -
TCP选项之TCP_KEEPALIVE
KEEPALIVE机制,是TCP协议规定的TCP层(非应用层业务代码实现的)检测TCP本端到对方主机的TCP连接的连通性的行为。避免服务器在客户端出现各种不良状况时无法感知,而永远等在这条TCP连接上。 该选项可以设置这个检测行为的细节,如下代码所示:int keepAlive = 1; // 非0值,开启keepalive属性int keepIdle = 6转载 2017-03-16 19:45:09 · 862 阅读 · 0 评论 -
TCP之半关闭与CLOSE_WAIT
终止一个连接要经过4次握手。这由TCP的半关闭(half-close)造成的。既然一个TCP连接是全双工(即数据在两个方向上能同时传递,可理解为两个方向相反的独立通道),因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向连接。当一端收到一个FIN,内核让read返回0来通知应用层另一端已经终止了向本端的数据传送。发送FIN通常是应用层对socke转载 2017-03-16 19:44:24 · 497 阅读 · 0 评论 -
TCP之RST发送场景
1.connect一个不存在的端口;2.向一个已经关掉的连接send数据;3.向一个已经崩溃的对端发送数据(连接之前已经被建立);4.close(sockfd)时,直接丢弃接收缓冲区未读取的数据,并给对方发一个RST。这个是由SO_LINGER选项来控制的;5.a重启,收到b的保活探针,a发rst,通知b。TCP socket在任何状态下,只要收到R转载 2017-03-16 19:42:58 · 504 阅读 · 0 评论 -
TCP之控制connect超时
客户端在连接服务器时,可能会出现问题,导致三次握手无法完成,持续重试,表现在客户端程序的行为就是卡在connect调用上无法返回,这样的客户端是非常不友好的。下面是我以前做开发工程师的时候常常在项目中使用的可控制超时的connect源码,3秒超时,粘贴即可使用。 正确程序:#include #include #include #include #include #转载 2017-03-16 19:41:56 · 1677 阅读 · 0 评论 -
TCP选项之SO_REUSEADDR
SO_REUSEADDR据《UNIX网络编程》卷一所说,此选项用于4种用途我本人在TCP服务器上只处理过两种,其他情况如有需要,请参考《UNIX网络编程》卷一1.引自《UNIX网络编程》卷一多进程绑定同一对IP和PORT,按时序举个多进程模式tcp服务器的例子 a.父进程进行监听; b.来syn包,请求连接; c.派生子进程处理用户长连接转载 2017-03-16 19:37:54 · 398 阅读 · 0 评论 -
TCP之listen
有几个概念需要在开头澄清一下TCP socket分两种,监听socket和传输socket两种监听socket:负责处理网络上来的连接请求(客户端的syn包到达便是连接请求来了,如果不知道syn包,请参看一下TCP三次握手);传输socket:负责在网络上的两个端点之间传输TCP数据。 未决socket:pending socket,就是某客户端的syn包到转载 2017-03-16 19:36:02 · 874 阅读 · 0 评论 -
socket阻塞、非阻塞,同步、异步、I/O模型
1、“同步”和“异步”如果单单理解这两个概念还是很好区分的:同步:处理事情的的时候需要串行执行,也就是说做完一件再去做另一件,不管是否需要时间等待。也就是说,无条件等待这件事被完成。异步:处理事情的的时候可以并发,即可以同时做几件事,不需要一件事做完再做另一件事。也就是说,当一件事完成的时候,通知我完成了就OK了。(这里需要注意理解的是,用于真正处理事件的是转载 2017-06-15 10:01:26 · 274 阅读 · 0 评论 -
sk_buff 结构体 以及 完全解释 (2.6.16)
struct sk_buff { /* These two members must be first. */ struct sk_buff *next; struct sk_buff *prev; struct sock *sk; struct转载 2017-06-15 11:00:07 · 959 阅读 · 0 评论 -
linux下recv 、send阻塞、非阻塞区别和用法
非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明: 基本概念: 阻塞IO:: socket 的阻塞模式意味着必须要做完IO 操作(包括错误)才会 返回。 非阻...转载 2018-06-11 22:18:17 · 764 阅读 · 0 评论 -
缺省网关 理解
其原理是:假设两个使用IP协议的站点A、B通过第三层交换机进行通信,发送站点A在开始发送时,把自己的IP地址与B站的IP地址比较,判断B站是否与自己在同一子网内。若目的站B与发送站A在同一子网内,则进行二层的转发。若两个站点不在同一子网内,如发送站A要与目的站B通信,发送站A要向“缺省网关”发出ARP(地址解析)封包,而“缺省网关”的IP地址其实是三层交换机的三层交换模块接下来设想一下...转载 2018-12-12 13:22:56 · 5499 阅读 · 0 评论 -
交换机的工作原理
说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的。在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,即为MAC地址表,交换机就是根据这张表负责将数据帧传输到指定的主机上的。交换机的工作原理 交换机在接收到数据帧以后,首先会记录数据帧中的源MAC地址和对应的接口到MAC表中,接着会检查自己的MAC表中是否有数据帧中目标MAC地...转载 2018-12-12 10:27:28 · 20940 阅读 · 5 评论 -
网线数据传输最大距离?100米最大距离是怎么得来的?
网线数据传输最大距离对网络比较了解的朋友,都知道双绞线有一个“无法逾越”的“100米”传输距离。无论是10M传输速率的三类双绞线,还是100M传输速率的五类双绞线,甚至1000M传输速率的六类双绞线,最远有效传输距离为100米。在综合布线规范中,也明确要求水平布线不能超过90米,链路总长度不能超过100米。也就是说,100米对于有线以太网而言是一个极限,这个极限是从网卡到集线设备的链路长度。...转载 2018-12-22 14:21:00 · 6431 阅读 · 0 评论 -
multi netcard static route
Persistent Routes: Network Address Netmask Gateway Address Metric 0.0.0.0 0.0.0.0 172.29.127.62 1 172.29.0.0 255.255.0.0 172.29.131.62 1...原创 2018-12-20 10:33:56 · 233 阅读 · 0 评论 -
路由器转发规则
源主机在发起通信之前,将Self IP与目的主机的IP进行比较,如果两者位于同一网段(用子网掩码计算后具有相同的网络号),那么源主机直接向目的主机发送ARP请求,在接收到目的主机的ARP应答后获取对方的MAC地址,然后用对方的MAC地址作为目的MAC进行报文发送,位于同一VLAN(网段)的主机互访时属于这种情况,这是互联的交换机做二层交换转发。 当源主机判断目的主机与自己位于不同网段...转载 2018-12-12 17:01:26 · 4492 阅读 · 0 评论 -
二层交换 三层交换
网关:是下一站路由器的IP地址,第三层网络层负责IP地址,第二层数据链接层则负责MAC地址。1.数据转发依靠的关键字不同,二层转发主要依靠MAC地址,而三层转发主要依靠IP地址。2.数据交换的范围不同,二层交换指在同一网段内的通信,三层交换指跨网段的通信。3.在三层转发的过程中,还要进行二层的封装。也就是说,在转发过程中二层帧头中的(源、目的)MAC地址是要改变的。但是IP数据报中...转载 2018-11-03 11:07:39 · 5661 阅读 · 0 评论 -
FTP send RST
当发送文件时 FTP Server 发送RST信号主动断开连接!经查询原因发现是FTP 在Write IO 时 空间不足,FTP Server 发送RST值得注意的是RST报文段不会导致另一端产生任何响应,另一端根本不进行确认。收到RST的一方将终止该连接。程序行为如下:阻塞模型下,内核无法主动通知应用层出错,只有应用层主动调用read()或者write()这样的IO系统调用时,内核才会利用出错来...原创 2018-06-07 18:09:06 · 1412 阅读 · 0 评论 -
阻塞机制下的recv小结
Recv是socket编程中最常用的函数之一,在阻塞状态的recv有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结。 首先阻塞接收的recv有时候会返回0,这仅在socket被正常关闭时才会发生。 而当拔掉设备网线的时候,recv并不会发生变化,仍然阻塞,如果在这个拔网线阶段,socket被关掉了,后果可能就是re...转载 2018-06-11 22:19:23 · 3627 阅读 · 0 评论 -
TCP性能优化之避免慢启动
TCP协议中有个慢启动,在《TCP/IP详解卷一》中占据的篇幅很小,但是这个东西,在某些业务场景下,对性能的影响非常大。什么是慢启动最初的TCP的实现方式是,在连接建立成功后便会向网络中发送大尺寸的数据包,假如网络出现问题,很多这样的大包会积攒在路由器上,很容易导致网络中路由器缓存空间耗尽,从而发生拥塞。因此现在的TCP协议规定了,新建立的连接不能够一开始就发送大尺寸的数据包,而只转载 2017-03-16 19:32:30 · 938 阅读 · 0 评论 -
TCP性能优化之避免大量握手
问题的起因在海量用户高并发访问的大型网站后台,有一些基本的系统维护需求。比如迁移海量小文件,就是从一些机器拷贝海量小碎文件到另一些机器,来完成一些系统维护的基本需求。请不要小看这样的需求,这是服务器领域乃至云计算领域几个最复杂的问题之一,量变到质变,由量大引起的难题。今天在我这篇文章中,我只说这个如何避免大量握手来提升TCP层的传输加速问题。言归正传,大量握手为什么会对拷贝海量转载 2017-03-16 19:30:37 · 829 阅读 · 0 评论 -
skb的两个函数pskb_copy和skb_copy
skb的两个函数pskb_copy和skb_copy前者仅仅是将sk_buff的结构体和线性数据copy过来,对于非线性数据,是引用原始的skb的数据的!而后者是不仅将sk_buff和线性数据拷贝,同时将非线性数据也copy了一份,看下面就明白了!这就在效率上就差了很多!所以如果不想修改数据,那么还是使用pskb_copy更好!对于skb_copy:转载 2017-01-08 17:27:49 · 4892 阅读 · 0 评论 -
sk_buff 内存申请和释放
struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask, int fclone, int node){ struct kmem_cache *cache; struct skb_shared_info *shinfo; struct sk_buff *skb; u8 *data; cache = fcl转载 2017-01-08 16:05:54 · 3380 阅读 · 0 评论 -
sk_buff 详解(一)
/*socket buffers,简称skb,中文名字叫套接字缓存。它作为网络数据包的存放地点,使得协议栈中每个层都可以对数据进行操作,从而实现了数据包自底向上的传递。该结构维护一个收到的或者要发送的网络包。但其本身并不包含存放网络包的数据的存储区。存储区是另外单独分配的内存空间,但该结构说明了如何访问存储区空间,如何维护多个存储区空间以及存储网络包解析的成果。所有的sk_buff是通原创 2017-01-08 15:38:19 · 6496 阅读 · 2 评论 -
skb_buff 详解(二)
skbuffs是那些linux内核处理网络分组的缓存。网卡收到分组后,将它们放进skbuff,然后再传送给网络堆栈。网络堆栈一直要用到skbuff。1. 一个完整的skb buff组成(1) struct sk_buff--用于维护socket buffer状态和描述信息(2) header data--独立于sk_buff结构体的数据缓冲区,用来存放报文分组,使各层协议的head转载 2017-01-08 15:35:57 · 10727 阅读 · 2 评论 -
SKB 的分配细节.
1. 关于 SKB 的分配细节.LINUX 中 SKB 的分配最终是由函数 : struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,int fclone) 来完成.SKB 可以分为 SKB 描述符与 SKB 数据区两个部分,其中描述符必须从 CACHE 中来分配 : 或者从skbuff_fclone_cache 中转载 2017-01-08 15:04:20 · 1199 阅读 · 0 评论 -
sk_buff详细介绍
struct sk_buff可能是linux网络代码中最重要的数据结构,它表示接收或发送数据包的包头信息,并包含很多成员变量供网络代码中的各子系统使用。 // 这个结构被网络的不同层(MAC或者其他二层链路协议,三层的IP,四层的TCP或UDP等)使用,并且其中的成员变量在结构从一层向另一层传递时改变。// L4向L3传递前会添加一个L4的头部,同样,L3向L2传递前,会添加一个L3的头部原创 2017-01-07 13:16:22 · 2294 阅读 · 0 评论 -
写给那些让我糊里糊涂的HTTP、TCP、UDP、Socket
先来一个讲TCP、UDP和HTTP关系的,注意红色mark的部分 1、TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。在传输层中有TCP协议与UDP协议。在应用层有FTP、HTTP、TELNET、SMTP、DNS等协议。因此,HTTP本身就是一个协议,是从Web服务器传输超文转载 2016-08-25 20:19:33 · 311 阅读 · 0 评论 -
TCP网络关闭的状态变换时序图
TCP共有11个网路状态,其中涉及到关闭的状态有5个。在我们编写网络相关程序的时候,这5个状态经常出现。因为这5个状态相互关联,相互纠缠,而且状态变化触发都是由应用触发,但是又涉及操作系统和网络,所以正确的理解TCP 在关闭时网络状态变化情况,为我们诊断网络中各种问题,快速定位故障有着非常重要的作用和意义。下是是根据W.Richard Stevens的《TCP/IP详解》一书的TCP状态转转载 2016-08-25 19:51:37 · 511 阅读 · 0 评论 -
Linux 内核网络协议栈 ------ 数据从接收到ip层
此处主要讲的是从数据来到,中断到最终数据包被处理的过程。0:首先来介绍一下IO端口访问问题,内核提供了这样一组函数处理: // kernel/io.c中>: inb( )、inw( )、inl( )函数 分别从I/O端口读取1、2或4个连续字节。 后缀“b”、“w”、“l”分别代表一个字节(8位)、一个字(16位)以及一转载 2017-01-08 17:47:35 · 666 阅读 · 0 评论 -
子网掩码怎么理解
从前有一个地主,有256间房子,地主家的门牌号码是“192.168.1”,那么他家第一间房子的门牌号码是192.168.1.0,第二间是192.168.1.1,…第256间的编号是192.168.1.255。地主老了,需要把256间房子分给4个儿子,平均分配,每个儿子可以分64间。请来一位先生主持公道,先生这么来操作:192.168.1.0-192.168.1.63 分给大儿子19转载 2017-03-20 20:17:01 · 23178 阅读 · 4 评论 -
网络杂谈
“淡泊明志,心静如水”,心静可以产生智慧,如果诸位不信,可以尝试一次,当心完全静下来时,会不经意产生很多灵感。计算机网络架构非常清晰,美国人发明了TCP/IP协议,这个协议栈向上支持各种应用程序,比如浏览器、邮件客户端等,向下和网卡/驱动程序对接起来,这样应用程序发出的数据,被TCP/IP协议栈在中间处理了一下,最后被网卡发出,最终到达目的地。之所以要被TCP/IP处理一下,是因为加上一些转载 2017-03-20 20:20:32 · 408 阅读 · 0 评论 -
TCP选项之SO_RCVBUF和SO_SNDBUF
SO_RCVBUF SO_SNDBUF先明确一个概念:每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的滑动窗口便是依赖于这两个独立的buffer以及此buffer的填充状态。接收缓冲区把数据缓存入内核,应用进程一直没有调用read进行读取的话,此数据会一直缓存在相应socket的接收缓冲区内。再啰嗦一点,不管进程是否读取socket,转载 2017-03-16 19:28:31 · 971 阅读 · 0 评论 -
TCP选项之SO_RCVLOWAT和SO_SNDLOWAT
SO_RCVLOWAT SO_SNDLOWAT每个套接口都有一个接收低潮限度和一个发送低潮限度。接收低潮限度:对于TCP套接口而言,接收缓冲区中的数据必须达到规定数量,内核才通知进程“可读”。比如触发select或者epoll,返回“套接口可读”。发送低潮限度:对于TCP套接口而言,和接收低潮限度一个道理。TCP的接收缓冲区和发送缓冲区概念不是很清晰的话,请参考另一篇博文《TC转载 2017-03-16 19:27:31 · 1405 阅读 · 0 评论 -
TCP之深入浅出send和recv
需要理解的3个概念1. TCP socket的buffer每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的流量(拥塞)控制便是依赖于这两个独立的buffer以及buffer的填充状态。接收缓冲区把数据缓存入内核,应用进程一直没有调用recv()进行读取的话,此数据会一直缓存在相应socket的接收缓冲区内。再啰嗦一点,不管进程是否转载 2017-03-16 19:26:15 · 738 阅读 · 0 评论 -
TCP之ACK发送场景
我现在的理解,在有以下几种情景,TCP会把ack包发出去:1.收到1个包,启动200ms定时器,等到200ms的定时器到点了(第二个包没来),于是对这个包的确认ack被发送。这叫做“延迟发送”;2.收到1个包,启动200ms定时器,200ms定时器还没到,第二个数据包又来了(两个数据包一个ack);3.收到1个包,启动200ms定时器,还没超时,正好要给对方发点内容。于是对转载 2017-03-16 19:21:13 · 560 阅读 · 0 评论 -
TCP和1448
TCP和14481448字节是实际场景下,单个TCP包的实际运载能力。也就是说,实际场景下,上层调用send(1000KB),下层会把这1000KB封装成多个TCP包进行发送。单个TCP包每次打包1448字节的数据进行发送。详细的TCP在传输情景wireshark截图如图1每个TCP包在理论上应该能打包更多数据才对,但是实际场景下TCP传输为什么会以这个1448作为打包单位转载 2017-03-16 19:18:26 · 735 阅读 · 4 评论 -
网卡工作原理
Linux操作系统的功能可以概括为进程管理、内存管理、文件系统管理、设备管理、网络等几部分。所有的系统操作最终都可以映射到对物理设备的操作。除去对CPU、内存以及其他少数几个物理实体的操作之外,系统对其他设备的所有操作都通过专门的称为驱动程序的代码完成。系统中存在的每种外设在内核中都必须有对应的设备驱动程序对其进行处理。所以分析网卡的工作原理即是分析网卡的驱动程序。网络是独立的一个模块。为了屏转载 2017-03-16 19:14:43 · 1646 阅读 · 0 评论 -
wireshark过滤命令
一、IP过滤:包括来源IP或者目标IP等于某个IP比如:ip.src addr==192.168.0.208 or ip.src addr eq 192.168.0.208 显示来源IP ip.dst addr==192.168.0.208 or ip.dst addr eq 192.168.0.208 显示目标IP二、端口过滤:比如:tcp.port e转载 2017-03-21 19:56:37 · 451 阅读 · 0 评论