请问应用层协议的解析需不需要考虑TCP丢包的情况?

窗外蓝天 2016-12-02 09:12:46
大家好,最近在做网络通信的时候碰到这个问题,请教一下各位。
我在标题中提到的丢包是指,发送了A包+B包+C包(简写为ABC,后面都用字母表示),然后接收时,只收到了AC。我想到了两种情况:
1.如果接收缓冲大小足够大(大到能够一次性接收到ABC),那么根据TCP实现可靠性的原理,应该不会出现这种情况。
2.如果接收缓冲大小不足以一次性接收ABC,导致ABC需要分两次接收到,同时认定缓冲接收满之后会让后续收到的数据覆盖原有缓冲内容,那么只要在接收时,把接收到数据进行拼接,数据应该还是完整的。

所以请大家帮我看看,我有没有忽略什么情况?

昨天在另一个版发了一个同样的帖子,但是那个版人好像比较少,所以那个帖子就当作散分了。
http://bbs.csdn.net/topics/392057339
...全文
481 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiqiang01234 2016-12-02
  • 打赏
  • 举报
回复
引用 2 楼 q408384053 的回复:
[quote=引用 1 楼 pengzhixi 的回复:] 应用层一般不需要考虑tcp协议丢包的情况。
那设计协议的时候考虑丢包是不是显得有点多此一举?[/quote] 长数据分包发送后,接收端必然要对完整性进行验证,应用层少不了做这个工作
luciferisnotsatan 2016-12-02
  • 打赏
  • 举报
回复
引用 8 楼 luciferisnotsatan 的回复:
Winsock是个广泛应用的库,应该没什么问题。除非是你的网卡有问题,比如山寨货,驱动写的有问题。 包头加长度好还是加包尾或者两者都有,这要看你具体的应用。没有哪种一定比另一种好。
Winsock你是创建的TCP(SOCK_STREAM),而不是UDP(SOCK_DGRAM)吧。
luciferisnotsatan 2016-12-02
  • 打赏
  • 举报
回复
Winsock是个广泛应用的库,应该没什么问题。除非是你的网卡有问题,比如山寨货,驱动写的有问题。 包头加长度好还是加包尾或者两者都有,这要看你具体的应用。没有哪种一定比另一种好。
窗外蓝天 2016-12-02
  • 打赏
  • 举报
回复
to #5 @luciferisnotsatan 如果包大小比较小,是不是加上一个包分隔符就好了?
窗外蓝天 2016-12-02
  • 打赏
  • 举报
回复
引用 4 楼 luciferisnotsatan 的回复:
如果你是用的那些有很多人在用的socket库,那么应该不会出现这个问题。检查下你自己的发送代码和接受代码,会不会自己写的拼接出了问题。 另外,建议你抓下包看看
意思是如果是直接使用Winsock就就可能出现问题吗?
luciferisnotsatan 2016-12-02
  • 打赏
  • 举报
回复
如果你是用的那些有很多人在用的socket库,那么应该不会出现这个问题。检查下你自己的发送代码和接受代码,会不会自己写的拼接出了问题。 另外,建议你抓下包看看
引用 3 楼 q408384053 的回复:
[quote=引用 2 楼 q408384053 的回复:] [quote=引用 1 楼 pengzhixi 的回复:] 应用层一般不需要考虑tcp协议丢包的情况。
那设计协议的时候考虑丢包是不是显得有点多此一举?[/quote] 比如加包头,又加包尾,又加长度(如果不考虑协议安全性问题的话)。[/quote] 如果是你应用层协议,那要看你实际的应用。比如,你要一个包头用来说明传输的是你应用里面那种类型的数据,数据多大。又加包尾,是因为有可能某些数据在发送时,还不知道具体有多大。比如一个连续数据,知道用户按了停止才结束,不想都全生成完了再发送,而是一边生成一边发送。
luciferisnotsatan 2016-12-02
  • 打赏
  • 举报
回复
如果你是用的那些有很多人在用的socket库,那么应该不会出现这个问题。检查下你自己的发送代码和接受代码,会不会自己写的拼接出了问题。 另外,建议你抓下包看看
窗外蓝天 2016-12-02
  • 打赏
  • 举报
回复
引用 2 楼 q408384053 的回复:
[quote=引用 1 楼 pengzhixi 的回复:] 应用层一般不需要考虑tcp协议丢包的情况。
那设计协议的时候考虑丢包是不是显得有点多此一举?[/quote] 比如加包头,又加包尾,又加长度(如果不考虑协议安全性问题的话)。
窗外蓝天 2016-12-02
  • 打赏
  • 举报
回复
引用 1 楼 pengzhixi 的回复:
应用层一般不需要考虑tcp协议丢包的情况。
那设计协议的时候考虑丢包是不是显得有点多此一举?
pengzhixi 2016-12-02
  • 打赏
  • 举报
回复
应用层一般不需要考虑tcp协议丢包的情况。
赵4老师 2016-12-02
  • 打赏
  • 举报
回复
引用 12 楼 q408384053 的回复:
[quote=引用 11 楼 zhao4zhong1 的回复:] 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
这个帖子讨论得很详细啊,收藏了[/quote] 我参加讨论过的值得收藏的帖子还是屈指不可数的。
窗外蓝天 2016-12-02
  • 打赏
  • 举报
回复
引用 15 楼 zhao4zhong1 的回复:
TCP不可能send(ABC)recv(AC) UDP才可能
看来是我想多了,谢谢
赵4老师 2016-12-02
  • 打赏
  • 举报
回复
UDP才可能sendto(A)sendto(B)sendto(C)recvfrom(A)recvfrom(C)
赵4老师 2016-12-02
  • 打赏
  • 举报
回复
TCP不可能send(ABC)recv(AC) UDP才可能
窗外蓝天 2016-12-02
  • 打赏
  • 举报
回复
引用 9 楼 luciferisnotsatan 的回复:
[quote=引用 8 楼 luciferisnotsatan 的回复:] Winsock是个广泛应用的库,应该没什么问题。除非是你的网卡有问题,比如山寨货,驱动写的有问题。 包头加长度好还是加包尾或者两者都有,这要看你具体的应用。没有哪种一定比另一种好。
Winsock你是创建的TCP(SOCK_STREAM),而不是UDP(SOCK_DGRAM)吧。[/quote] 是的
窗外蓝天 2016-12-02
  • 打赏
  • 举报
回复
引用 10 楼 jiqiang01234 的回复:
[quote=引用 2 楼 q408384053 的回复:] [quote=引用 1 楼 pengzhixi 的回复:] 应用层一般不需要考虑tcp协议丢包的情况。
那设计协议的时候考虑丢包是不是显得有点多此一举?[/quote] 长数据分包发送后,接收端必然要对完整性进行验证,应用层少不了做这个工作[/quote] 您指的是 发送的数据和接收的数据一致 还是指 接收到的数据能够拼接成一个完整包? 如果是前者的话,如果不一致,我暂时认为是被攻击,数据包被修改,我暂时不考虑这个情况。如果收后者,感觉像我说的发送ABC收到AC这种情况了,但这种情况可能发生吗?
窗外蓝天 2016-12-02
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
这个帖子讨论得很详细啊,收藏了
赵4老师 2016-12-02
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧