与网络开发相关的招聘时最常被问起的问题是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