没有合适的资源?快使用搜索试试~ 我知道了~
用了TCP协议 数据一定不会丢失吗684 - 708
需积分: 0 0 下载量 42 浏览量
2023-05-15
09:49:31
上传
评论
收藏 1.8MB PDF 举报
温馨提示
试读
25页
用了TCP协议 数据一定不会丢失吗684 - 708
资源推荐
资源详情
资源评论
但为了简化模型,我们把中间的服务器给省略掉,假设这是个端到端的通信。且为了保证消
息的可靠性,我们盲猜它们之间⽤的是TCP协议进⾏通信。
为了发送数据包,两端⾸先会通过三次握⼿,建⽴TCP连接。
⼀个数据包,从聊天框⾥发出,消息会从聊天软件所在的⽤户空间拷⻉到内核空间的发送缓
冲区(send buffer),数据包就这样顺着传输层、⽹络层,进⼊到数据链路层,在这⾥数据
包会经过流控(qdisc),再通过RingBuffer发到物理层的⽹卡。数据就这样顺着⽹卡发到了
纷繁复杂的⽹络世界⾥。这⾥头数据会经过n多个路由器和交换机之间的跳转,最后到达⽬的
机器的⽹卡处。
此时⽬的机器的⽹卡会通知DMA将数据包信息放到 RingBuffer 中,再触发⼀个硬中断给
CPU , CPU 触发软中断让 ksoftirqd 去 RingBuffer 收包,于是⼀个数据包就这样顺着物理
层,数据链路层,⽹络层,传输层,最后从内核空间拷⻉到⽤户空间⾥的聊天软件⾥。
画了那么⼤⼀张图,只⽔了200字做解释,我多少是有些⼼痛的。
到这⾥,抛开⼀些细节,⼤家⼤概知道了⼀个数据包从发送到接收的宏观过程。
可以看到,这上⾯全是密密麻麻的名词。
整条链路下来,有不少地⽅可能会发⽣丢包。
但为了不让⼤家保持蹲姿太久影响身体健康,我这边只重点讲下⼏个常⻅容易发⽣丢包的场
景。
建⽴连接时丢包
TCP协议会通过三次握⼿建⽴连接。⼤概⻓下⾯这样。
在服务端,第⼀次握⼿之后,会先建⽴个半连接,然后再发出第⼆次握⼿。这时候需要有个
地⽅可以暂存这些半连接。这个地⽅就叫半连接队列。
如果之后第三次握⼿来了,半连接就会升级为全连接,然后暂存到另外⼀个叫全连接队列的
地⽅,坐等程序执⾏ accept() ⽅法将其取⾛使⽤。
是队列就有⻓度,有⻓度就有可能会满,如果它们满了,那新来的包就会被丢弃。
可以通过下⾯的⽅式查看是否存在这种丢包⾏为。
从现象来看就是连接建⽴失败。
# 全连接队列溢出次数
# netstat -s | grep overflowed
! !4343 times the listen queue of a socket overflowed
# 半连接队列溢出次数
# netstat -s | grep -i "SYNs to LISTEN sockets dropped"
! !109 times the listen queue of a socket overflowed
剩余24页未读,继续阅读
资源评论
Wangzc_1116
- 粉丝: 42
- 资源: 79
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功