数据收发小结

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地址做一个更详细的说明。

往期内容

用通俗易懂的话理解HTTP

DNS与IP地址的那些事


协议栈发送数据


深入理解协议栈的内部结构——创建和连接

深入理解协议栈的内部结构——收发和断开

 

  • 44
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值