一个网络的面试题

重新整理了这个问题:
http://blog.csdn.net/tianjing0805/article/details/78265674

题目

发送方发送的数据大于接收方的接收缓存, 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: 对这个问题朋友有完美答案,给我留言哦!

你可能感兴趣的:(杂记,面试题,tcp,网络)