基于tcp的socket在内核中都有一个发送缓冲区和接收缓冲区,tcp的双工工作模式以及tcp的滑动窗口就是依赖于这两个独立的buffer以及buffer的数据填充状态。接收缓冲区把数据缓存入内核之中,如果对应的应用一直没有调用socket的read方法进行数据读取,则此数据会一直被缓存在接收缓冲区中,如果接收缓冲区满了,便会通知对方socket,以调整对方socket的发送窗口大小,这就是滑动窗口的实现。如果对方仍然持续发送数据,接收方在接收缓冲区没有被读取的情况下将丢弃后到的数据,这就是tcp的流量控制。对于udp来说,它没有真正的发送缓冲区,只要有数据就会发送,无论对方能否正常正确接收,这也是udp丢包的原因之一,但是udp的socket 和tcp的socket一样都会有接收缓冲区,而且行为也一样。
写在最后有的面试官吹水,号称http长连接,这个说法其实是不准确的,长连接和短连接是针对tcp协议而言,http只是建立在tcp/ip协议之上的应用层的一个协议。总体而言,tcp和udp设计的数据结构和算法有很多,这里只是粗略的说了一下,有兴趣的同学可以去研究tcp协议那本书。