总流程图

process_of_socket

接收流程

TCP接收到数据之后会写入到TCP本身的Buffer里,然后会拷贝到应用层(亦即我们的应用程序)的接收Buffer中。在满足以下条件时,TCP接收Buffer的数据会被写入到到应用层的接收Buffer并且recv()返回:

  • TCP头部中的PSH被置为1
  • TCP接收Buffer溢出
  • 数据在TCP接收Buffer中存放的时间超过了0.5s

发送流程

应用层的发送Buffer把数据写入到TCP的Buffer中:
如果应用层的发送Buffer超过了TCP发送Buffer的大小,就会发生阻塞,直到把所有数据写入到TCP的Buffer中才会返回。

在TCP进行Nagle优化时,如果发送的Buffer太大并且满足了Nagle算法优化场合,TCP就会先发送部分数据,这时候对端就会出现我们平时所说的粘包或者残包,需要在业务上进行拼接和解析。

结语

这个系列到此结束了,主要讲述了TCP协议的一些比较底层的理论问题,也许大多数人甚至是从事网络通信(如写服务器)的程序员也不一定了解过,工作上也几乎很少用到。不过有必要建议还是花点时间了解一下,不一定要深究,但至少对得起自己的情怀和职业呀。。

参考书籍:《TCP/IP详解》