你好,这是《网络是怎样连接的》的第2篇读书笔记,第二章《用电信号传输TCP/IP》前半部分:数据收发操作。
收发数据的过程通过套接字完成,整个过程分为三个阶段:
1.创建套接字
2.收发操作
3.删除套接字
1.创建套接字
一般来说,服务器的应用程序在启动时候就会创建好套接字并且进入等待连接状态。客户端通常在用户触发特定动作,需要访问服务器的时候才会创建套接字,这个时候,还没有开始传输网络包。
2.收发操作
套接字创建完毕,客户端就可以向服务器发起连接操作。
2.1连接操作
首先,客户端会生成一个SYN为1的TCP包发送给服务器,这个TCP包的头部包含了客户端向服务器发送数据时使用的初始序号,以及服务器向客户端发送数据时需要用到的窗口大小。
客户端发送包到达服务器之后,服务器会返回一个SYN为1的TCP包,这个包的头部包含了序号和窗口大小,此外,还包含含表示确认收到了客户端TCP包的ACK号。
服务器响应包到达客户端时,客户端会向服务器返回一个包表示确认的ACP号,至此,连接操作就完成了,双方进入数据收发阶段。
2.2收发操作
浏览器会先向服务器发送请求信息,TCP会将请求消息切分成一定大小的数据块,并在每一块前面加上TCP头部,然后发送给服务器。TCP头部包含序号,表示当前发送的是第几个字节的数据。
当服务器收到数据时,会向客户端返回ACK信号。
服务器刚开始的时候,只是不断接收数据,随着数据收发的进行,数据不断传递给应用程序,接收缓冲区就会被逐步释放。这时,服务器需要将新的窗口大小告知客户端。
当服务器收到客户端的请求消息后,会向客户端返回响应消息,这个过程和客户端发送的过程正好相反。
2.3 断开操作
服务器的响应消息发送完毕之后,数据的收发操作就结束了,开始执行断开操作。
在web应用中,服务器其会先发起断开过程。
服务器先发送一个FIN为1的TCP包,然后客户端返回一个表示确认收到的ACK号。
接下来,双方还会交换一组方向相反的FIN为1的TCP包和包含ACK号的TCP包。
3.删除套接字
断开操作完成后,等待一段时间,套接字就会被删除。
学过网络套接字编程的对这个整体流程不陌生,只不过面向对象编程中所有的操作都是在套接字上完成的。通过今天的学习发现,套接字本身就是对协议栈的封装,实际上是协议栈在执行实际TCP通信过程。这些对理解网络的工作过程有用,同时,也能扩展编程思想,提升程序设计能力。