tcp 要如何联调好呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
SelectLanguage
V2EX    问与答

tcp 要如何联调好呢?

  •  
  •   SelectLanguage 2020-05-23 18:27:20 +08:00 1841 次点击
    这是一个创建于 1968 天前的主题,其中的信息可能已经有所发展或是发生改变。
    服务端和客户端通过 TCP 通讯
    大概有几万个客户端,偶尔会有几个客户端出现异常
    问了服务端开发,看服务端日志,说是消息下发下去了,
    问了客户端开发,查看客户端日志,说消息没有收到
    到底是客户端还是服务端的问题?有什么好的方法确认吗?
    8 条回复    2020-05-23 23:50:22 +08:00
    mhycy
        1
    mhycy  
       2020-05-23 18:47:32 +08:00
    协议设计有问题,是否正确收到消息需要正确设计 ACK 机制,不能把数据传到了缓冲区就写入日志说是成功发送
    ( TCP 底下的 send 操作全都是到达缓冲区)
    SelectLanguage
        2
    SelectLanguage  
    OP
       2020-05-23 19:04:44 +08:00
    @mhycy 什么是正确的 ACK 机制 能否举个例子
    zexinwu84
        3
    zexinwu84  
       2020-05-23 19:29:02 +08:00 via Android
    在自己的应用层,实现收到确认的定义
    SelectLanguage
        4
    SelectLanguage  
    OP
       2020-05-23 20:02:33 +08:00
    @zexinwu84 那收到确认的定义 如果没收到呢。。。。还是在纠结某到消息到底送达没
    linvon
        5
    linvon  
       2020-05-23 20:36:41 +08:00 via iPhone
    那就抓包呗
    hercule
        6
    hercule  
       2020-05-23 23:23:03 +08:00   2
    我说说我的想法,不一定是正确的,只是提供一个参考,如果有不对的地方,麻烦指正。
    首先,就像一楼同志说的那样,如果记录的日志是在应用层调用 send 后,就记录,其实这个 send 只是把数据放入了发送缓存区,是操作系统再发送出去,所以,记录日志成功,不代表就已经真正发送成功了。
    TCP 是可靠传输,按照一般来说,只要双方的连接没出现问题,就应该收到数据,即使出现丢包的问题,也会重传。linux 系统有个 tcp_retries2 变量设置了重传次数,重传时间间隔是指数级退避,直到达到 120s 为止,默认重传次数是 15 次,总时间将近 15 分钟,你可以比较一下日志当中这个连接是否出现了这么多次重传,如果出现了这么多次重传,那么说明,服务端应该是没问题,应该是客户端死机等等情况,造成不能正常接收。
    发送缓存区的数据什么时候丢失,有种情况,就是收到对方的 RST 的时候,立马释放资源,丢掉了发送缓存区的数据。比如:当客户端出现状况,重启,就丢失了这条连接,但是服务端并不知道这种情况,还是发送数据给客户端,因为对客户端来说,这条连接已经不存在,当收到数据的时候,就会回复一个 RST 报文,这个时候,服务端就立马释放资源。
    turi
        7
    turi  
       2020-05-23 23:27:00 +08:00
    6 楼说的不错,只要连接不断开,发送给操作系统的缓存数据,最终都会到达另一端。

    至于抓包,小概率时间抓包不现实
    gimp
        8
    gimp  
       2020-05-23 23:50:22 +08:00
    定位问题可以用 Wireshark 抓包。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2392 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 15:38 PVG 23:38 LAX 08:38 JFK 11:38
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86