Tcp 的可靠性讨论


#1

时闻有人说, TCP 并不可靠. 可靠性还是需要自己设计好应用层协议来保证.

诚如此, TCP 所谓何用? 说 TCP 不可靠皆在于没有的方法不得当.

吾曾博览群库, 除 asio 外未见有正确使用了 TCP 之网络库.

要保证可靠通信, 需要这么做: send 要保证回回 > 0, 发送完毕调用 shutdown 而不是 close . 接着对方 recv 返回 EOF , 然后对方调用 shutdown

那么这边收到了 fin 内核向你这边的 recv 返回 EOF 这个时候你才 close 掉 socket


#2

这是一个非常重要的地方,也正是可靠性的保证,可惜事实就是有些人喜欢画蛇添足,自作聪明,觉得tcp不可靠,搞出各种2B代码来处理所谓的不可靠的情况,而且还到处传播tcp不可靠这种错误经验。 另外,设计错误的网络库太多了,忽悠卖书库muduo就是其中之一,楼主提到的2个点,他都犯了,亦无法获取断开状态。


#3

哈哈,shutdown?要去补习一下,一直以来都是粗爆的close


#4

完整的 TCP 通信过程从 connect 开始, 到 EOF 结束.

没有收到 EOF 前的 close 统统是不可靠的一次 tcp 通信.

必定收到 EOF 后才能调用 close.

对于主动执行 shutdown 的发送方也一样, shutdown 后也不能调用 close, 而是要一直等待 EOF. 然后关闭. 接收方则是因为主动收到了 EOF 因此 close. 接收方的 close 结果就是发送方收到了 EOF 于是双方都是 EOF 后才 调用的 close . 因此通信是 100% 可靠的了


#5

时间上还是有不可靠的地方

关键是peer意外断开不会立刻受到系统给的错误消息

所以网游还是要加ping、、、