网络编程释疑之: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


相关文章
|
1天前
|
缓存 网络协议 网络架构
【计算机网络】第三章 数据链路层(MAC地址 IP地址 ARP协议)
【计算机网络】第三章 数据链路层(MAC地址 IP地址 ARP协议)
|
3天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
10天前
|
网络协议 Java API
深度剖析:Java网络编程中的TCP/IP与HTTP协议实践
【4月更文挑战第17天】Java网络编程重在TCP/IP和HTTP协议的应用。TCP提供可靠数据传输,通过Socket和ServerSocket实现;HTTP用于Web服务,常借助HttpURLConnection或Apache HttpClient。两者结合,构成网络服务基础。Java有多种高级API和框架(如Netty、Spring Boot)简化开发,助力高效、高并发的网络通信。
|
10天前
|
存储 网络协议 安全
15.网络协议-Radius协议
15.网络协议-Radius协议
|
10天前
|
存储 网络协议 网络安全
14.网络协议-邮件协议
14.网络协议-邮件协议
|
14天前
|
存储 JSON 前端开发
网络原理(4)HTTP协议(下)
网络原理(4)HTTP协议
26 0
|
18天前
|
存储 网络协议 Linux
|
18天前
|
安全 SDN 数据中心
|
18天前
|
网络协议 安全 网络性能优化
|
网络协议
TCP/IP协议的介绍
TCP/IP协议是众多协议的统称,通过分层结构来管理。可分为七层模型或四层结构