首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

nc命令卡住不返回分析

具体通过如下命令获取zk状态: echo stat | nc 192.168.73.77 2181 出现问题时,发现nc命令一直没有返回,导致无法执行后续步骤(程序压根没启动)。...到zk上查看了对应日志,也没有发现对应时间段有错误打印。 既然zk都没有错误日志信息,那只能先分析下nc命令当前卡在哪里了。...内部处理流程本质上就是先建立tcp连接,然后循环处理socket上可读可写事件,当有可读事件,并且长度0(EOF)时,回调处理中标记退出循环,然后整个进程也就跟着退出了。...而长度0可读事件,是收到FIN后,内核协议栈往上发送可读事件。 结合上面说FIN_WAIT2,就可以知道nc命令为什么不退出了。...通过增加参数“+vvvvvv”查看nc命令执行过程中输出,对比正常情况和异常情况,可以清楚看到这一点: 正常退出情况: 异常不退出情况: 清楚了问题所有环节,只剩下为什么nc命令没有收到

2.4K30

TCP协议详解

--滑动窗口 滑动窗口滑过程中,他一直告诉我处理不过来了,不让传数据了怎么办?--ZWP 滑动窗口滑过程中,他处理得慢,就理所当然每次让发很少数据,导致网络利用率很低怎么办?...每个选项开始是1字节kind字段,说明选项类型 kind0和1选项,只占一个字节 其他kind后有一字节len,表示该选项总长度(包括kind和len) kind11,12,13表示tcp事务...同样道理,主动关闭服务器,2MSL时间内立马启动是会报端口被占用错误 多并发短连接情况下,会出现大量Time_wait状态。这两个参数可以解决问题,但是它违背了tcp协议,是有风险。...服务器对于并发请求处理 正等待连接一端有一个固定长度队列(长度叫做“积压值”,大多数情况长度5) 该队列中连接:已经完成了三次握手,但还没有被应用层接收(应用层需要等待最后一个ack收到后才知道这个连接...,ACk是累计,它表示接收方已经正确收到一直到确认序号-1所有字节 延时时间:绝大多数200ms。

92732
您找到你想要的搜索结果了吗?
是的
没有找到

一文讲透TCP三次握手到底怎么实现

len 传入地址长度,bind函数会根据该字段判断传入参数addr怎么解析。...两个socket描述字: 输入参数,监听socket描述字listensockfd 返回已连接socket描述字 为什么要把两个套接字分开呢?...客户端收到了RST(复位)回答,这时候客户端会立即返回CONNECTION REFUSED错误。...形象一点比喻是这样,有A和B想进行通话: A先对B说:“喂,你在么?口令是j。” B收到之后大声回答:“收到口令j并准备好了,你准备好了吗?口令是k。”...A收到之后也大声回答:“收到口令k并准备好了,我们开始吧。” 可以看到,这样应答过程总共进行了三次,这就是TCP连接建立之所以被叫为“三次握手”原因了。

64310

网络知识扫盲:扒开 TCP 外衣,看清了 TCP 本质

这个SYN 包 seq 0。这是第一次握手。 当服务端接收这个 SYN 包时,知道了有人要连接自己,就发了一个 ACK 包说:你要连接这件事,已经知道啦。...关于 为什么需要握手(注意:这里还没开始讨论为什么要三次握手),认为应该有两个理由: 同步起始序列号,后续数据传输做准备 保证双方都可能发送数据且能接收数据 关于第一点,其实两次握手就可以,客户端把自己...:“可以呀” # 没有向对方确认是否可以听到自己就开始一直说说说 :“你吃饭了吗?“ :“人呢?“ :“喂?“ :“去哪啦?...在每一次跟确认可以听到对方声音时,还生怕这个消息对方收不到这个消息,所以两个人就一直在确认,跟个zz一样。 所以你问我,为什么不握手五次或更多?...socket 其中参数backlog作用 设置内核中队列长度

59640

TCP 协议中三次握手与四次挥手及相关概念详解

4、TCP 服务是基于流,而 UDP 是基于数据报,基于流数据没有边界(长度)限制,而基于数据报服务,每个 UDP 数据报都有一个长度,接收端必须以该长度最小单位将其所有内容一次性读出。...3、发送端接收到确认信息,再发回给接收端,表示已接受到你的确认信息,此时标志仍 ACK,确认序号为 522。 涉及到问题:为什么是三次握手,而不是四次或者两次? 首先解释为什么不是四次。...很明显,接收方并不知道也不能保证发送方一定接收到 “好” 这条信息,一旦接收方真的没有收到这条信息,就会出现接收收“单方面连接”情况,这个时候发送方就会一直重试发送连接请求,直到真正收到 “好”...涉及到问题:为什么需要四次握手,不是三次? 三次过程是这样: 发送方:不再给你发送数据了。 接收方:好也不给你发了。 发送方:好,拜拜。...) # 第三个参数,如果0,也不可复用 # 第三个如果1,可以复用 # s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(

42520

网络中进程之间如何通信?

connect函数第一个参数即为客户端socket描述字 第二参数服务器socket地址,第三个参数socket地址长度。客户端通过调用connect函数来建立与TCP服务器连接。...socket描述字; 第二个参数指向struct sockaddr *指针,用于返回客户端协议地址; 第三个参数协议地址长度。...当读成功时,read返回实际所读字节数; 如果返回值是0表示已经读到文件结束了,小于0表示出现了错误。 如果错误EINTR说明读是由中断引起,如果是ECONNREST表示网络连接出了问题。...1)write返回值大于0,表示写了部分或者是全部数据。 2)返回值小于0,此时出现了错误。我们要根据错误类型来处理。如果错误EINTR表示在写时候出现了中断错误。...该函数第一个参数指定接收端套接字描述符; 第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到数据; 第三个参数指明buf长度; 第四个参数一般置0

55220

麻了,被字节问懵逼了!

要知道,端口资源也是有限,一般可以开启端口 32768~61000 ,也可以通过如下参数设置指定范围: net.ipv4.ip_local_port_range 那么,如果如果主动断开连接方...,造成数据传输错误。...accept() TCP 连接个数; Send-Q:当前 accpet 最大队列长度,上面的输出结果说明监听 8088 端口 TCP 服务进程,accpet 队列最大长度 128; 如果 Recv-Q...要解决这个问题,我们可以: 调大 accpet 队列最大长度,调大方式是通过调大 backlog 以及 somaxconn 参数。...检查系统或者代码为什么调用 accept() 不及时; 关于 SYN 队列和 accpet 队列,之前写过一篇很详细文章:TCP 半连接队列和全连接队列满了会发生什么?又该如何应对?

44020

TCP之三次握手四次挥手

确认号:即ACK,指明下一个期待收到字节序号,表明该序号之前所有数据已经正确无误收到。确认号只有当ACK标志1时才有效。比如建立连接时,SYN报文ACK标志位0。...由于首部可能含有可选项内容,因此TCP报头长度是不确定,报头不包含任何任选字段则长度20字节,4位首部长度字段所能表示最大值1111,转化为10进制为15,15*32/8=60,故报头最大长度...首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中起始偏移值。 保留:占6位,保留今后使用,但目前应都位0。...为什么会采用三次握手,若采用二次握手可以吗? 四次呢? 建立连接过程是利用客户服务器模式,假设主机A客户端,主机B服务器端。...采用三次握手是为了防止失效连接请求报文段突然又传送到主机B,因而产生错误

413100

又被百度捞起来了,能赢吗?

所以,边缘触发模式一般和非阻塞 I/O 搭配使用,程序会一直执行 I/O 操作,直到系统调用(如 read 和 write)返回错误错误类型 EAGAIN 或 EWOULDBLOCK。...讲一下多态理解 答:多态的话,理解是函数重载和虚函数,函数重载好处认为是同一个函数名可以对不同参数类型或者参数个数进行不同实现;虚函数认为是可以使得子类在继承父类时候,基于子类特点重写父类一些函数...答:认为应该可以 为什么呢,你对引用理解是什么? 答:因为认为引用其实相当于变量地址值,类似一个指针。 那么引用是不是可以理解const一个指针?...答:1 为什么呢? 答:就说了C++是固定地址,如果是0的话,调用时候会有地址冲突。 说到这个sizeof,你觉得它是函数吗? 答:它是运算符 运算符的话,一般在什么时候给它定好?...但是上限值是内核参数 somaxconn 大小,也就说 accpet 队列长度 = min(backlog, somaxconn)。 怎样设置一个套接字非阻塞模式?

6710

网络知识十二问

A发送断开消息给B,B回一条消息表示收到了,这个过程就保证了A断开成功。B发送断开消息给A,A回一条消息表示收到了,这个过程就保证了B断开成功。...服务器收到请求,需要请求者继续操作。 2XX - 请求成功。请求成功收到,理解并处理。 3XX - 重定向。需要进一步操作以完成请求。 4XX - 客户端错误。请求包含语法错误或无法完成请求。...所以一般要在请求头中设置Connection字段:keep-alive,表示维持连接不要断开,一直到某个数据包Connection字段close。...使用方法: 消息头部设置Transfer-Encoding: chunked 每一块会表明长度 由一个标明长度0chunk标示结束 目的: 让客户端快速响应,减少等待时间。维持长连接。...通过设置content-typemultipart/form-data,来发送二进制格式文件。支持多个文件上传,还可以带上文本参数。 这种是最常见做法。

67510

请求数据包从发送到接收,都经历什么?

那协议栈收到了这一堆二进制序列之后是不是就直接交给网卡发送了呢? 都这么问了,那显然不是了... 其实协议栈在收到数据之后并不会马上就会就发送出去,而是会先写入位于内存 Buffer 中。...例如我发这篇文章时所发请求数据长度就可能超过 MSS 。 此时就需要对数据进行拆分,按照 MSS 长度单位进行拆分,将拆出来数据分别装进不同数据包中。...这些发送过包都会暂存在 Buffer 中,如果传输过程中出错,则可以进行重发补偿措施。这也是为什么在数据链路层(例如网卡、路由器、集线器)等等都没有补偿机制,它们一旦检测到错误会直接将包丢弃。...那 TCP 不就一直无限循环把请求发下去了? 当然 TCP 设计时也考虑到了这种情况,其在重传几次无效之后,就会强制中断通信,并抛出错误给应用程序。...接收方会在确认应答时候,将自己剩余窗口大小写入,随ACK一起发送给发送方。 如果发送方接收到大小0,那么此时就会停止发送数据。

78020

请求数据包从发送到接收,都经历什么?

那协议栈收到了这一堆二进制序列之后是不是就直接交给网卡发送了呢? 都这么问了,那显然不是了... 其实协议栈在收到数据之后并不会马上就会就发送出去,而是会先写入位于内存 Buffer 中。...例如我发这篇文章时所发请求数据长度就可能超过 MSS 。 过长数据包拆分 此时就需要对数据进行拆分,按照 MSS 长度单位进行拆分,将拆出来数据分别装进不同数据包中。...这些发送过包都会暂存在 Buffer 中,如果传输过程中出错,则可以进行重发补偿措施。这也是为什么在数据链路层(例如网卡、路由器、集线器)等等都没有补偿机制,它们一旦检测到错误会直接将包丢弃。...那 TCP 不就一直无限循环把请求发下去了? 当然 TCP 设计时也考虑到了这种情况,其在重传几次无效之后,就会强制中断通信,并抛出错误给应用程序。...接收方会在确认应答时候,将自己剩余窗口大小写入,随ACK一起发送给发送方。 TCP流量控制 如果发送方接收到大小0,那么此时就会停止发送数据。

72620

理解TCP协议三次握手、四次挥手、流量控制、拥塞控制 、重传机制

,如IP地址、端口 TCP是一种字节流,它会处理IP层丢包、重复以及错误问题 在建立连接过程中,双方交换一些参数可以放到TCP头部 总结 :TCP提供了一种可靠、面向连接、字节流、传输层服务...为什么是三次冗余ACK 通过大量经验表明三次比较合适 为什么不进行两次握手 1、确认双方接收与发送能力是否正常 第一次握手:客户端发送网络包,服务端收到了。...服务端:服务端发送能力,客户端接收能力正常 2、防止已经失效连接请求报文突然又传送到了服务器,从而产生错误 如果客户端发出连接请求,因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求...,应该是发送请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传报文,接着给出回应报文,并且重启2MSL计时器 2、防止类似与”三次握手中提到了"已经失效请求报文段...服务器每收到一个客户端请求后都会复位这个计时器,时间通常设置2小时,若超时后还没有收到客户端任何数据,服务器就会发送一个探测报文段,以后每隔75s发送一次。

42320

TCP协议详解

数据报,长度是100,下一次确认号则为601 数据偏移: 占4位:0~15,单位:32位字(由此可以看出最大偏移15*4,即TCP首部长度介于20-60个字节之间) 数据偏离首部距离 不知道TCP...,发送方一直等到对方窗口变大,接收方一直等待对方发送消息 坚持定时器(解决死锁): 当发送方接收到窗口0消息,则启动坚持定时器 坚持定时器每隔一段时间发送一个窗口探测报文 这种死锁相当于情侣一方A一直等待对方...即发送方状态:同步已发送、建立连接。接收方状态:监听、同步已接收、建立连接 最早,接收方和发送方都是closed状态,即关闭。 为什么发送方要发出第三个确认报文(为什么需要第三次握手)?...(第一次超时)就会建立起两个连接,引起错误 本来这是一个早已失效报文段,但server收到此失效连接请求报文段后,就误认为是client再次发出一个新连接请求。...虚线是假设两次握手就建立连接 TCP连接四次挥手 比三次握手多出来是第二次挥手,意思是收到了,但是现在还没传完,等会关闭 主动关闭一方状态变化为:建立状态、第一次等待(FIN-WAIT-1)

44240

8000+字总结:一文搞定 UDP 和 TCP 高频面试题!

序号:用于对字节流进行编号,例如序号为 301,表示第一个字节编号为 301,如果携带数据长度 100 字节,那么下一个报文段序号应为 401。 确认号:期望收到下一个报文段序号。...例如 B 正确收到 A 发送来一个报文段,序号为 501,携带数据长度 200 字节,因此 B 期望下一个报文段序号为 701,B 发送给 A 的确认报文段中确认号就为 701。...1、第三次握手是为了防止失效连接请求到达服务器,让服务器错误打开连接。 2、换个易于理解视角来看为什么要 3 次握手。...: 消息定长:发送端将每个数据包封装为固定长度(不够可以通过补 0 填充),这样接收端每次接收缓冲区中读取固定长度数据就自然而然把每个数据包拆分开来。...接收方发送的确认报文中窗口字段可以用来控制发送方窗口大小,从而影响发送方发送速率。将窗口字段设置 0,则发送方不能发送数据。

1.3K21

网络数据传输,recv && send?没那么简单!

,recv函数就把s接收缓冲中数据copy到buf中(注意协议接收到数据可能大于buf长度,所以在这种情况下要调用几次recv函数才能把s接收缓冲中数据copy完。...参数释义: 参数一:指定接收端套接字描述符; 参数二:指明一个缓冲区,该缓冲区用来存放recv函数接收到数据; 参数三:指明buf长度参数四 :一般置0。...参数一:指定发送端套接字描述符; 参数二:存放应用程序要发送数据缓冲区; 参数三:实际要发送数据字节数; 参数四:一般置0。...char buffer[128]; buffer[128] = '\0'; 通过 recv 读取字符数 128 时,就会是文稿中结果。...-1 : 0; return rc; } 在进行报文解析时,第 15 行对实际报文长度msg_length和应用程序分配缓冲区大小进行了比较,如果报文长度过大,导致缓冲区容纳不下,直接返回

67430

记一次线上DPDK-LVS故障排查

其中10.128.x.x是rsip,10.115.x.0/24是dpvslocal ip,通过在rs上抓包结果可以清楚看出rs发给dpvslength184包正确传输,但length...2一直在重传,且直至超时都没有成功,同时在client上抓包显示,client收到了这个length2包,但是由于tcp checksum error被丢掉了,并没有交给上层应用去处理,这样就解释了为什么异常时表现是...+ tcp data = 14 + 20 + 20 + 5 = 59,而我们知道,在网络中传输数据帧最小长度64字节,除去FCS4字节(这部分也由网卡自行计算后添加在数据包末尾),最小长度应为60...对此rfc894是这样规定: 因此rs网卡在数据包长度不足60字节时需要做两件事情: 补充1字节padding达到最小长度60字节 补充padding0 可以看到,在二层头中,确实有个补充...计算错误,client收到后丢弃了这个包 ps:以上是rs网卡在添加padding时补充不是全0,另一种场景是client网卡在添加padding时补充不是全0,这两种情况都会导致上述问题出现

1.6K40

recv函数说明返回值

请问这种错误如何避免。是否要在 recv之前,判定连接是否中断,如果未中断则recv.  恩。最后查了一下,是因为服务端关闭了套接字,才导致这边recv返回0。...该函数第一个参数指定接收端套接字描述符;  第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到数据;  第三个参数指明buf长度; 第四个参数一般置0。...当协议把数据接收完毕,recv函数就把s接收缓冲中数据copy到buf中 (注意协议接收到数据可能大于buf长度,所以 在这种情况下要调用几次recv函数才能把s接收缓冲中数据copy完。...返回说明:  成功执行时,返回接收到字节数。 另一端已关闭则返回0。...:sock索引不是套接字 当返回值是0时,正常关闭连接; 思考: 当对侧没有send,即本侧套接字s接收缓冲区无数据,返回值是什么(EAGAIN,原因为超时,待测) http://hi.baidu.com

4.8K10

recv&send函数

参数释义: 参数一:指定接收端套接字描述符; 参数二:指明一个缓冲区,该缓冲区用来存放recv函数接收到数据; 参数三:指明buf长度参数四 :一般置0。...参数一:指定发送端套接字描述符; 参数二:存放应用程序要发送数据缓冲区; 参数三:实际要发送数据字节数; 参数四:一般置0。...s发送缓冲中数据或者s发送缓冲中没有数据,那么 send就比较s发送缓冲区剩余空间和len: (i)如果len大于剩余空间大小send就一直等待协议把s发送缓冲中数据发送完; (...,recv函数就把s接收缓冲中数据copy到buf中(注意协议接收到数据可能大于buf长度,所以在这种情况下要调用几次recv函数才能把s接收缓冲中数据copy完。...,那么它返回0

1.1K20
领券