1.本章主题
在前两章我们讲解了TCP协议下收发应用程序数据的操作,这部分内容很长,我们将在这一章总结,这也可以为我们后面的学习打下基础。
2.创建套接字
服务器一方会在启动时就创建好套接字,并且等待客户端的套接字连接。而客户端的套接字会在客户端需要访问服务器的时候才会套接字。套接字就是控制信息,里面会记录服务器的IP地址,端口号,发出去的消息过了多久等消息。协议栈会负责创建套接字,但是创建套接字之后,套接字一开始是没有任何消息的,它会被设置为一个初始值,显示它从来没有连接过别的服务端。
3.连接操作
在执行connect操作时,客户端会向服务器发起连接操作。客户端会发给服务器一个SYN值是1的TCP包,并且会随机出一个初始值,以及服务器的滑动窗口大小。服务器收到了这个网络包后,如果服务器不接受这个连接,那么服务器响应一个RST比特为1的包。而如果接受这个连接请求,服务器会返回一个SYN值为1的包,这个包中也会包含它所随机出来的序号和窗口大小,以及在收到了客户端发送的序号后所生成的ACK号。客户端在收到服务器的响应后将会把服务端的序号,端口号等消息存入套接字,也会生成一个ACK号返回给服务器。
4.收发数据
在双方连接完后,就要开始正式地通信了。应用程序会调用write请求,并且把发送的数据交给协议栈,协议栈会找到对应的套接字,并从套接字中取出接收方的IP地址,端口号等。协议栈会根据包的大小作出对应的操作。如果包比较小的话,它会等待一段时间,如果包的大小和MSS差不多的话,发送方会把包发送给接收方。如果包比较大,发送方会把发送的数据以MSS为一个包的大小,分别在头部加上TCP头部,然后发送给发送方。当接收方接收到数据后,会把数据放在接受缓存区,并且会把ACK号返回给发送方。如果接收方的接受缓存区被逐步释放了,那么接收方在返回发送方ACK号时会一并把现在的缓存区的大小告诉发送方,发送方就可以根据这个缓存区判断发送数据的速率。
5.断开连接
在发送完数据后,如果是HTTP1.0版本,发送方会调用close,并且发送一个FIN为1的TCP包,接收方接收到这个包后会返回包含ACK的包并且把相对应的套接字标记为断开状态。之后接收方也会发送一个FIN为1的TCP包,但是套接字并不会马上被删除,这是为了防止包发送错误,如果这个时候套接字被删除了,那么这个网络包就没有办法发送到正确的地方了,所以套接字会等待几分钟再删除。至此消息的收发操作到此结束了。
结尾
这就是数据收发的全部内容了,之后我们会对以太网和IP地址做一个更详细的说明。