博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络编程释疑之:TCP协议的“流”特性
阅读量:6148 次
发布时间:2019-06-21

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

与网络开发相关的招聘时最常被问起的问题是TCP和UDP的区别,现在几乎是道上混的都能答出来几点“比如TCP是面向连接的,UDP是无连接的;TCP是可靠的,UDP是不可靠的;”,其中还有一点是“TCP是面向数据流的协议,UDP是面向数据报的协议”,接下来我通常就会问这么一个问题,假设客户端一次完全发送这么一串字符str = "hello world!"到服务端,在服务端一次read,并且read长度的参数大于strlen(str)的情况下,用TCP和UDP协议会有什么区别?


这个问题难倒了不少人,当然也许我的问题假设的不好或者比较极端。我期望得到的答案是:在网络没有出问题的情况下,用UDP协议发送的话在服务端很有可能什么也收不到,要么是全部收到了"hello world!"这个字符串,而不再有其他情况;用TCP协议发送的话,很有可能一次read只是得到了"hello world!"的部分字符,也许一次全部收到,甚至多次read累积缓冲区才能收到整个字符串。

其实上面这个问题在实际情况里系统内核的套接字缓冲区充足时对于TCP而言肯定会一次完整的收到整个字符串。我主要是为了说明TCP协议的“流”特性。举这么一个例子类比一下,我们要把一个空碗接满水,我们可以一次倒入也可以分多次倒入。但是我们要把一个馒头完整的放进另一个碗中,你的选择只有放一次。接水的过程就如TCP数据传输的过程一般,放馒头的过程就如UDP的传输过程一般(也可能中间你犯馋直接把馒头吃了)。

对TCP的“流”的理解是进行TCP网络编程的基础,我们常说进行网络编程中协议设计是关键,那么设计协议时就必须要考虑到TCP“流”的特性去得到一条完整的协议数据。write,read方法调用,IO多路复用的使用都与“流”有着很大的关系。包括我们经常听说的TCP分包问题,粘包问题也是“流”造成的。

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

你可能感兴趣的文章
(二)Spring Boot 起步入门(翻译自Spring Boot官方教程文档)1.5.9.RELEASE
查看>>
Java并发编程73道面试题及答案
查看>>
企业级负载平衡简介(转)
查看>>
ICCV2017 论文浏览记录
查看>>
科技巨头的交通争夺战
查看>>
当中兴安卓手机遇上农行音频通用K宝 -- 卡在“正在通讯”,一直加载中
查看>>
Shell基础之-正则表达式
查看>>
JavaScript异步之Generator、async、await
查看>>
讲讲吸顶效果与react-sticky
查看>>
c++面向对象的一些问题1 0
查看>>
直播视频流技术名词
查看>>
IOC —— AOP
查看>>
比特币现金将出新招,推动比特币现金使用
查看>>
数据库的这些性能优化,你做了吗?
查看>>
某大型网站迁移总结(完结)
查看>>
部署SSL证书后,网页内容造成页面错误提示的处理办法
查看>>
MS SQLSERVER通用存储过程分页
查看>>
60.使用Azure AI 自定义视觉服务实现物品识别Demo
查看>>
Oracle 冷备份
查看>>
jq漂亮实用的select,select选中后,显示对应内容
查看>>