网络编程释疑之:TCP协议的“流”特性

简介:

与网络开发相关的招聘时最常被问起的问题是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分包问题,粘包问题也是“流”造成的。

本文转自永远的朋友博客51CTO博客,原文链接http://blog.51cto.com/yaocoder/1339958如需转载请自行联系原作者


yaocoder


相关文章
|
16天前
|
负载均衡 网络协议 算法
|
7天前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
36 3
|
10天前
|
网络虚拟化
生成树协议(STP)及其演进版本RSTP和MSTP,旨在解决网络中的环路问题,提高网络的可靠性和稳定性
生成树协议(STP)及其演进版本RSTP和MSTP,旨在解决网络中的环路问题,提高网络的可靠性和稳定性。本文介绍了这三种协议的原理、特点及区别,并提供了思科和华为设备的命令示例,帮助读者更好地理解和应用这些协议。
27 4
|
18天前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
46 13
|
18天前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
19天前
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
4月前
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解
|
4月前
|
Java 大数据
如何在Java中进行网络编程:Socket与NIO
如何在Java中进行网络编程:Socket与NIO
|
4月前
|
Java API 网络安全
Java网络编程入门
Java网络编程入门
|
4月前
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解

热门文章

最新文章