TCP网络协议与java编程的一些联系

422 阅读2分钟

在阅读这篇文章之前,希望可以先阅读我的上一篇文章:

www.jianshu.com/p/b0d0023b3…

这时候能更好的理解我这篇文章想要讲的一些内容。很久以前,我也是狠狠的把网络编程的BIO、NIO、AIO以及channel,I/O多路复用的一些底层方面的去研究了以下,现在重新整理了一遍TCP协议之后,就像要去思考和总结下,两者之间的一些联系和关系。

image.png
对于TCP通信来说,每个TCP的socket内核中都有一个发送缓冲区和接收缓冲区,TCP是全双工模式的以及TCP的滑动窗口都是依赖于两个独立的Buffer以及该Buffer的填充状态。

接收缓冲区会把数据缓冲到内核,如果用户进程一直没有执行Socket的read方法时,数据就会一直缓存在接收缓冲区中,不管进程是否读取,在对端发来的数据都会经过内核接收,并缓存到Socket的接收缓冲区中。

当调用read时,是把接收缓冲区中的数据拷贝一份到应用层的Buffer中。

当进程调用发送数据时,会把数据从应用层的Buffer中复制到Socket内核中的发送缓冲区,然后send就会在上层返回,换句话说,数据不一定会被发送到对端。

Socket的接收缓冲区被TCP用来缓存从网络上收到的数据。一直保存到应用进程读走为止。如果应用层一直没有读走,那么Buffer就会满了,这时候出现的情况就是:

通知对端的TCP协议中窗口关闭,保证TCP接收区的数据不会被移除,保证TCP是可靠性传输的。

还想要讲解一些BIO,NIO,AIO但是感觉太多了,只能另外开一篇了。