socket之内核操作

简单记录下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的长度也会影响到网络发送的吞吐量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值