TCP/IP (三) TCP消息的接收
2015-11-25 21:15
543 查看
上一篇文章提到:
先发送数据包data1,再发送数据包data2,
data1的数据是有可能比data2先达到对端的接收缓冲区,
但是对端调用接收函数时,是不可能先读取到data2再读取到data1,
下面说明为什么会出现这种情形。
这里先借用陶大师的一张图,
情景:socket为阻塞模式,调用recv等方法时flag标志位为0,未对SO_RCVLOWAT做设置
1. 应用程序开始收取TCP消息,与程序所在的机器网卡上接收到网络里发来的TCP消息,这是两个独立的流程,所以第一篇文章中提到的通过127.0.0.1发送数据,只经过内核,不经过网卡,也就可以理解了。
2.接收TCP消息最终会调用tcp_recvmsg方法,而tcp_recvmsg会首先锁住socket,因此socket是可以被多进程同时使用的。
3.内核在处理接收到的TCP报文时使用了4个队列容器,分别为receive、out_of_order、prequeue、backlog队列
receive:receive队列是允许用户进程直接读取的,它是将已经接收到的TCP报文,去除了TCP头部、排好序放入的、用户进程可以直接按序读取的队列
out_of_order:失序的数据包,暂时存放
prequeue:未被处理的数据包,暂时存放
backlog:未被处理的数据包,暂时存放
这里的数据流是比较复杂的,有兴趣研究清楚的可以点击文章末尾推荐的链接进去学习,这里就不搬陶大师的劳动成果了。
4.flags参数MSG_PEEK标志位会导致receive队列不会删除报文,MSG_PEEK主要用于多进程读取同一套接字的情形
5.阻塞socket模式下,flags参数中若携带MSG_WAITALL标志位,则意味着必须等到读取到len长度的消息才能返回,否则按SO_RCVLOWAT属性处理
参考资料:《tcp/ip详解卷1》
参考文章:http://blog.csdn.net/russell_tao/article/details/9950615 强烈推荐!
先发送数据包data1,再发送数据包data2,
data1的数据是有可能比data2先达到对端的接收缓冲区,
但是对端调用接收函数时,是不可能先读取到data2再读取到data1,
下面说明为什么会出现这种情形。
这里先借用陶大师的一张图,
情景:socket为阻塞模式,调用recv等方法时flag标志位为0,未对SO_RCVLOWAT做设置
1. 应用程序开始收取TCP消息,与程序所在的机器网卡上接收到网络里发来的TCP消息,这是两个独立的流程,所以第一篇文章中提到的通过127.0.0.1发送数据,只经过内核,不经过网卡,也就可以理解了。
2.接收TCP消息最终会调用tcp_recvmsg方法,而tcp_recvmsg会首先锁住socket,因此socket是可以被多进程同时使用的。
3.内核在处理接收到的TCP报文时使用了4个队列容器,分别为receive、out_of_order、prequeue、backlog队列
receive:receive队列是允许用户进程直接读取的,它是将已经接收到的TCP报文,去除了TCP头部、排好序放入的、用户进程可以直接按序读取的队列
out_of_order:失序的数据包,暂时存放
prequeue:未被处理的数据包,暂时存放
backlog:未被处理的数据包,暂时存放
这里的数据流是比较复杂的,有兴趣研究清楚的可以点击文章末尾推荐的链接进去学习,这里就不搬陶大师的劳动成果了。
4.flags参数MSG_PEEK标志位会导致receive队列不会删除报文,MSG_PEEK主要用于多进程读取同一套接字的情形
5.阻塞socket模式下,flags参数中若携带MSG_WAITALL标志位,则意味着必须等到读取到len长度的消息才能返回,否则按SO_RCVLOWAT属性处理
参考资料:《tcp/ip详解卷1》
参考文章:http://blog.csdn.net/russell_tao/article/details/9950615 强烈推荐!
相关文章推荐
- Linux socket 初步
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝
- vivi下重新调整分区