![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
通信相关
yhc166188
路虽远,行则将至;事虽难,做则必成!
展开
-
p2p打洞技术原理
什么是打洞,为什么要打洞由于Internet的快速发展 IPV4(网际协议版本4)地址不够用,不能每个主机分到一个公网IP 所以使用NAT地址转换一般来说都是由私网内主机主动发起连接,数据包经过NAT地址转换后送给公网上的服务器,连接建立以后可双向传送数据,NAT设备允许私网内主机主动向公网内主机发送数据,但却禁止反方向的主动传递,但在一些特殊的场合需要不同私网内的主机进行互联(例如P2P软件、网络会议、视频传输等),TCP穿越NAT的问题必须解决。nat的几种类型现在基本使用这种,又分为对原创 2020-08-12 20:39:36 · 1455 阅读 · 0 评论 -
TCP拥塞控制原理
发生拥塞控制的原因:资源的需求>可用资源作用:拥塞控制就是防止过多的数据包进入网络,这样可以使网络中的路由器或者链路不至于过载。拥塞控制的前提就是网络能够承受现有的网络负荷。对比流量控制:拥塞控制是一个全局的过程,涉及到链路上的所有主机和路由。流量控制往往指的是点对点通信的控制,是端对端的问题。流量控制:(1)tcp提供了一种机制可以让发送端根据接收端的实际接收能力来控制...原创 2019-11-03 14:29:17 · 264 阅读 · 0 评论 -
TCPUDP 常见的错误码
文章目录在实际TCP&UDP C/S数据收发过程中,常见errorcode有ECONNABORTED(WSAECONNABORTED),ECONNRESET(WSAECONNRESET),nonblockingio当然还有WOULDBLOCK(WSAWOULDBLOCK)。ECONNABORTED(WSAECONNABORTED)该错误被描述为“software caused...原创 2020-01-17 11:42:46 · 2483 阅读 · 0 评论 -
TCP之异常关闭的意义
终止一个连接的正常方式是发送FIN。在发送缓冲区中所有排队数据都已发送之后才发送FIN,正常情况下没有任何数据丢失。但我们有时也有可能发送一个RST报文段而不是FIN来中途关闭一个连接。这称为异常关闭。进程关闭socket的默认方式是正常关闭,如果需要异常关闭,利用SO_LINGER选项来控制。 异常关闭一个连接对应用程序来说有两个优点:(1)丢弃任何待发的已经无意义的数据,并立...原创 2018-08-01 16:29:52 · 183 阅读 · 0 评论 -
TCP选项之SO_LINGER
SO_LINGER这个选项在我以前带队改造haproxy的时候引出过一个reset(RST)客户端连接的bug。SO_LINGER作用设置函数close()关闭TCP连接时的行为。缺省close()的行为是,如果有数据残留在socket发送缓冲区中则系统将继续发送这些数据给对方,等待被确认,然后返回。利用此选项,可以将此缺省行为设置为以下两种 a.立即关闭该连接,通过发送RST分组(而...原创 2018-08-01 16:50:18 · 157 阅读 · 0 评论 -
TCP性能优化之避免慢启动
TCP协议中有个慢启动,在《TCP/IP详解卷一》中占据的篇幅很小,但是这个东西,在某些业务场景下,对性能的影响非常大。 什么是慢启动最初的TCP的实现方式是,在连接建立成功后便会向网络中发送大尺寸的数据包,假如网络出现问题,很多这样的大包会积攒在路由器上,很容易导致网络中路由器缓存空间耗尽,从而发生拥塞。因此现在的TCP协议规定了,新建立的连接不能够一开始就发送大尺寸的数据包,而只能从...原创 2018-08-06 16:01:45 · 1443 阅读 · 0 评论 -
TCP选项之SO_RCVLOWAT和SO_SNDLOWAT
SO_RCVLOWAT SO_SNDLOWAT每个套接口都有一个接收低潮限度和一个发送低潮限度。接收低潮限度:对于TCP套接口而言,接收缓冲区中的数据必须达到规定数量,内核才通知进程“可读”。比如触发select或者epoll,返回“套接口可读”。发送低潮限度:对于TCP套接口而言,和接收低潮限度一个道理。TCP的接收缓冲区和发送缓冲区概念不是很清晰的话,请参考另一篇博文https://...原创 2018-08-06 16:18:06 · 631 阅读 · 0 评论 -
网络技术(TCP/IP)问题
Q:OSI七层网络模型A:OSI(Open System Interconnect),即开放式系统互联,(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)为什么TCP建立连接需要三次握手,而断开连接需要四次挥手? 因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当...转载 2019-06-16 16:39:33 · 778 阅读 · 0 评论 -
OSI七层模型与TCP/IP五层模型
一、OSI参考模型 今天我们先学习一下以太网最基本也是重要的知识——OSI参考模型。1、OSI的来源 OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。 ISO为了更好的使网络应用更为普及,推出了OSI参考模型。其含义...转载 2019-06-16 16:51:35 · 287 阅读 · 0 评论 -
TCP的三次握手(建立连接)和四次挥手(关闭连接)
建立连接:理解:窗口和滑动窗口TCP的流量控制TCP使用窗口机制进行流量控制什么是窗口?连接建立时,各端分配一块缓冲区用来存储接收的数据,并将缓冲区的尺寸发送给另一端接收方发送的确认信息中包含了自己剩余的缓冲区尺寸剩余缓冲区空间的数量叫做窗口2. TCP的流控过程(滑动窗口)TCP(Transmission Control Protocol) 传输控制协...转载 2019-06-16 18:00:33 · 555 阅读 · 0 评论 -
KCP特点
这里先罗列下以前学习过的技术方案,以后有机会的我们再慢慢一个一个来梳理;KCP https://github.com/skywind3000/kcpUDT http://udt.sourceforge.net/QUIC Multipath Extension https://github.com/qdeconinck/mp-quicKCP相比UDT,KCP我最喜欢的一点就是简洁:一方面...转载 2019-06-27 16:46:18 · 1141 阅读 · 0 评论 -
解决TIME_WAIT过多造成的问题
1、 time_wait的作用:TIME_WAIT状态存在的理由:1)可靠地实现TCP全双工连接的终止 在进行关闭连接四次挥手协议时,最后的ACK是由主动关闭端发出的,如果这个最终的ACK丢失,服务器将重发最终的FIN,因此客户端必须维护状态信息允许它重发最终的ACK。如果不维持这个状态信息,那么客户端将响应RST分节,服务器将此分节解释成一个错误(在java中会抛出connect...转载 2019-07-11 11:44:25 · 1046 阅读 · 0 评论 -
理解TCP长连接(Keepalive)
TCP Keepalive的起源TCP协议中有长连接和短连接之分。短连接环境下,数据交互完毕后,主动释放连接;长连接的环境下,进行一次数据交互后,很长一段时间内无数据交互时,客户端可能意外断电、死机、崩溃、重启,还是中间路由网络无故断开,这些TCP连接并未来得及正常释放,那么,连接的另一方并不知道对端的情况,它会一直维护这个连接,长时间的积累会导致非常多的半打开连接,造成端系统资源的消耗和浪...转载 2019-07-17 16:32:31 · 272 阅读 · 0 评论 -
端口映射及动态端口静态端口
端口映射就是将外网主机的IP地址的一个端口映射到内网中一台机器,提供相应的服务。当用户访问该IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。端口映射有动态和静态之分。映射端口有两个含义1、同端口映射,指通过端口转换来获取公网ip地址的端口。2、指端口映射出来的端口,例如把电脑A的80端口映射到路由器公网ip上的80端口,那么路由器上的80端口就叫做映射端口。向...转载 2019-09-02 10:00:26 · 2178 阅读 · 0 评论 -
NAT的原理和类型
NAT(Network Address Translation,网络地址转换)当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。这种方法需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机...转载 2019-09-02 13:29:20 · 1256 阅读 · 0 评论 -
TCP选项之TCP_CORK和TCP_NODELAY
TCP_CORK TCP_NODELAY这两个选项是互斥的,打开或者关闭TCP的nagle算法,下面用场景来解释典型的webserver向客户端的应答,应用层代码实现流程粗略来说,一般如下所示: if(条件1){ 向buffer_last_modified填充协议内容“Last-Modified: Sat, 04 May 2012 05:28:58 GMT”; ...原创 2018-08-06 12:17:11 · 413 阅读 · 0 评论 -
TCP选项之SO_RCVBUF和SO_SNDBUF
SO_RCVBUF SO_SNDBUF先明确一个概念:每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的滑动窗口便是依赖于这两个独立的buffer以及此buffer的填充状态。接收缓冲区把数据缓存入内核,应用进程一直没有调用read进行读取的话,此数据会一直缓存在相应socket的接收缓冲区内。再啰嗦一点,不管进程是否读取socket,对端...原创 2018-08-06 10:01:12 · 2306 阅读 · 0 评论 -
IO多路复用之poll总结
1、基本知识 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。2、poll函数 函数格式如下所示...转载 2018-07-09 19:28:52 · 110 阅读 · 0 评论 -
网络IO之阻塞、非阻塞、同步、异步总结
1、前言 在网络编程中,阻塞、非阻塞、同步、异步经常被提到。unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一遍时候,似懂非懂,没有深入理解。网上有详细的分析:http://blog.csdn.net/historyasamirror/article/details/5778378。我结合网上博客和书总结一下,加以区别,加深理解。2、数据流向 ...转载 2018-07-09 19:30:41 · 125 阅读 · 0 评论 -
IO多路复用之select总结
1、基本概念多路复用 指进程受阻于select调用,等待任意多个套接字中的任何一个变为可读。 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。 (2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。 (3)如果...转载 2018-07-09 19:32:24 · 119 阅读 · 0 评论 -
IO多路复用之epoll总结
1、基本知识 epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。2、epoll接口 epoll操作过程需要三个接口,分别如下:#include <sys...转载 2018-07-09 19:33:34 · 108 阅读 · 0 评论 -
select、poll、epoll之间的区别总结[整理]
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝...转载 2018-07-09 19:34:11 · 116 阅读 · 0 评论 -
用户空间与内核空间,进程上下文与中断上下文[总结]
1、前言 最近在学习linux内核方面的知识,经常会看到用户空间与内核空间及进程上下文与中断上下文。看着很熟悉,半天又说不出到底是怎么回事,有什么区别。看书过程经常被感觉欺骗,似懂非懂的感觉,很是不爽,今天好好结合书和网上的资料总结一下,加深理解。2、用户空间与内核空间 我们知道现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操...转载 2018-07-09 19:34:54 · 163 阅读 · 0 评论 -
理论经典:TCP协议的3次握手与4次挥手过程详解
摘要: 本文将分别讲解经典的TCP协议建立连接(所谓的“3次握手”)和断开连接(所谓的“4次挥手”)的过程。1、前言尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振...转载 2018-07-26 13:45:38 · 228 阅读 · 0 评论 -
深入浅出TCP之listen
int listen(int fd, int backlog); 有几个概念需要在开头澄清一下TCP socket分两种,监听socket和传输socket两种监听socket:负责处理网络上来的连接请求(客户端的syn包到达便是连接请求来了,如果不知道syn包,请参看一下TCP三次握手);传输socket:负责在网络上的两个端点之间传输TCP数据。未决socket:pend...原创 2018-08-01 14:38:38 · 576 阅读 · 0 评论 -
TCP选项之SO_REUSEADDR
1、一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。 SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。TCP,先调用close()的一方会进入TIME_WAIT状态2、SO_R...原创 2018-08-01 15:08:29 · 635 阅读 · 0 评论 -
TCP之ACK发送场景
我现在的理解,在有以下几种情景,TCP会把ack包发出去:1.收到1个包,启动200ms定时器,等到200ms的定时器到点了(第二个包没来),于是对这个包的确认ack被发送。这叫做“延迟发送”;2.收到1个包,启动200ms定时器,200ms定时器还没到,第二个数据包又来了(两个数据包一个ack);3.收到1个包,启动200ms定时器,还没超时,正好要给对方发点内容。于是对这个包的确认...原创 2018-08-01 15:35:17 · 1268 阅读 · 0 评论 -
几种TCP连接中出现RST的情况
应该没有人会质疑,现在是一个网络时代了。应该不少程序员在编程中需要考虑多机、局域网、广域网的各种问题。所以网络知识也是避免不了学习的。而且笔者一直觉得TCP/IP网络知识在一个程序员知识体系中必需占有一席之地的。在TCP协议中RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的。发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓存区的包发送RST包。而接收端收到RST...原创 2018-08-01 15:56:38 · 339 阅读 · 0 评论 -
深入浅出TCP之半关闭与CLOSE_WAIT
终止一个连接要经过4次握手。这由TCP的半关闭(half-close)造成的。既然一个TCP连接是全双工(即数据在两个方向上能同时传递,可理解为两个方向相反的独立通道),因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向连接。当一端收到一个FIN,内核让read返回0来通知应用层另一端已经终止了向本端的数据传送。发送FIN通常是应用层对s...原创 2018-08-01 16:08:17 · 383 阅读 · 0 评论 -
TCP选项之TCP_KEEPALIVE
KEEPALIVE机制,是TCP协议规定的TCP层(非应用层业务代码实现的)检测TCP本端到对方主机的TCP连接的连通性的行为。避免服务器在客户端出现各种不良状况时无法感知,而永远等在这条TCP连接上。 该选项可以设置这个检测行为的细节,如下代码所示:int keepAlive = 1; // 非0值,开启keepalive属性int keepIdle = 60; //...原创 2018-08-01 16:22:10 · 422 阅读 · 0 评论 -
zmq和ucmq消息队列简述
ZMQ是什么?这是个类似于Socket的一系列接口,他跟Socket的区别是:普通的socket是端到端的(1:1的关系),而ZMQ却是可以N:M 的关系,人们对BSD套接字的了解较多的是点对点的连接,点对点连接需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等,而ZMQ屏蔽了这些细节,让你的网络编程更为简单。ZMQ用于node与node间的通信,node可以是主机或者是进程。区...原创 2018-07-09 19:18:55 · 1068 阅读 · 0 评论