简单记录下socket之内核操作(之前面试有被问到socket发送消息在操作系统底层是怎么弄的)
首先 客户端和服务端建立好socket套接字的时候,双方都可以通过套接字进行消息的收发,因为socket中维护了两个队列,发送队列和接受队列。
发送时,数据存储在用户的内存中,用户调用send和write方法时将待发送的数据依据MSS进行拆分,将拆分好的数据拷贝到内核空间的发送队列,该队列存放了所有已发送的包,有个数据结构sk_buff存储的就是数据包的信息,每个包都有一个序号,和一个状态码,只有当服务端返回ack时,才会把状态码改为成功,而且会将该ack报文之前的敖文都确认掉,如果长期没确认,会重新调用tcp_push发送,如果发送队列慢了,则从用户空间拷贝到内核空间的操作就会阻塞,并清理队列中已经处理过的包。tcp层会将数据包加上ip头然后给ip层处理,ip层将数据包加入到一个qdisc网卡驱动程序检测到qdisc有数据就会调用DMA Engine将sk_buff拷贝到网卡并发送出去,网卡驱动通过RingBuffer来指向内核中的数据,因此qdisc的长度也会影响到网络发送的吞吐量。
socket之内核操作
最新推荐文章于 2024-08-16 23:13:15 发布