网络编程释疑之: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的传输过程通常(也可能中间你犯馋直接把馒头吃了)。ide

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

相关文章
相关标签/搜索