博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个网络的面试题
阅读量:4211 次
发布时间:2019-05-26

本文共 1152 字,大约阅读时间需要 3 分钟。

重新整理了这个问题:

题目

发送方发送的数据大于接收方的接收缓存, TCP 协议下 ,接受方结果是什么呢(接受不全),可以用recv循环接受吗?(可以)。为什么呢?以上问题换成UDP协议又是什么结果?

这句为什么问的我扎心

内心中奔腾过好几个点,但是只答了一个TCP是可靠传输。UDP不行是因为UDP不可靠 。。。。。。

请用板砖敲我。

接下来让我好好总结总结我这道题目


脑海中飘过点1:

IO操作在 内核中分2步, 1. 数据准备阶段 2. 数据准备完,将数据从内核空间拷贝到用户空间。

所以数据已经接受完毕了,所以 数据从 用户空间到内核空间 只拷贝了 接收方缓存那么多, 也可以循环接收。
但是, 如果是这样的原因的话, UDP 为什么不行呢?在UDP协议下, 接受缓冲区空间小于包的大小, 直接返回的是-1. 接收不到&不能循环接收;

然后飘过点2:

TCP 有接收/发送 缓冲区, UDP 没有;所以可以有以上结果;

最后飘过点3

TCP 可靠,UDP不可靠。 呜呜呜 (>_<)


感觉自己答了一个最蠢的 。。。。。。

结束后和同学讨论:

同学1号: TCP 是流协议,那自然意味着你发送1024字节,对方不一定一次就recv了1024字节,可能因为网络状况差等情况,收取到的数据小于1024,那么就需要多次recv来得到数据.另外得到recv的返回值,它告诉你到底收到了多少数据。

贴吧,吧友1:

UDP是数据报,严格定界符,缓冲区必须够大,否则报错;

贴吧,吧友2:

tcp传输的实质,是流式传输,就是不管你发送的时候是一次发送多少,tcp的底层处理,都是一个字节一个字节按流发送的,其实和串口传输没什么区别,所以有的时候你一次发送的数据分2次或多次才能收到,或者分好几次发送的数据一次全收到了.所谓的粘包和丢包就是如此了。

但tcp有个好处是,虽然存在上述情况,tcp却能保证数据的先后顺序,就是说肯定先发的先到,后发的后到,要解决你的问题,简单办法就是做接收缓存.我一般习惯用循环队列做接收缓存,接收到数据后存到这个队列里,然后另外的线程或者时钟去处理这个缓存,先判断缓存里的数据长度是否够,然后再判断合法性进行处理


总结了一下,就是因为 TCP是字节流, UDP是数据报 。

流 ,可截断
报文, 要么有要么没有

面试官还先问了我TCP, UDP 的区别呢。回答 6 的起飞~

但是对区别没有认真的做理解,只有理论上的掌握。


给自己的提醒

保持清醒的头脑不要被面试官的节奏带跑,答的语无伦次。

遇到这种情况喝口水压压惊,再做个深呼吸。

把脑海中飘过的点,梳理一下尝试的答一答。可能没有解答好面试官的问题,但是他也会觉得你从多方面考虑了。

PS: 对这个问题朋友有完美答案,给我留言哦!

转载地址:http://rokmi.baihongyu.com/

你可能感兴趣的文章
数据仓库分层
查看>>
常见数据结构-TrieTree/线段树/TreeSet
查看>>
Hive数据倾斜
查看>>
TopK问题
查看>>
Hive调优
查看>>
HQL排查数据倾斜
查看>>
DAG以及任务调度
查看>>
LeetCode——DFS
查看>>
MapReduce Task数目划分
查看>>
ZooKeeper分布式锁
查看>>
3126 Prime Path
查看>>
app自动化测试---ADBInterface驱动安装失败问题:
查看>>
RobotFramework+Eclipse安装步骤
查看>>
测试的分类
查看>>
photoshop cc2019快捷键
查看>>
pycharm2019版本去掉下划线的方法
查看>>
SQL中EXISTS的用法
查看>>
10丨案例:在JMeter中如何设置参数化数据?
查看>>
11丨性能脚本:用案例和图示帮你理解HTTP协议
查看>>
12丨性能场景:做参数化之前,我们需要考虑什么?
查看>>