三次握手 握手的目标
?抓包
活动:慈云数据爆款香港服务器,CTG+CN2高速带宽、快速稳定、平均延迟10+ms 速度快,免备案,每月仅需19元!! 点击查看 序列号client 和server 是不一样的,也没从0开始
网络报文中报文可能会延迟,会重发,丢失。 为了不影响其他链接,所以是不同的而且是随机的
?
三次握手中的性能优化与安全问题
超时时间与缓冲队列
fast open降低时延
第一次建立连接请求还需要3次,但是多了个cookie
但第二次请求的时候,带着cookie和请求在syn中一起发送给server
linux 打开tcp fast open
如何应对syn攻击
tcp_syncookies
tcp_defer_accept
当server收到ack确认后放到accept队列中,这时候内核是否激活应用程序呢?
这个参数就是控制这个的,可以控制等数据来临时再激活应用程序,提升效率
MSS
?
重传与确认 PAR
提升并发能力的PAR改进版
PAWS
使用timestamp解决这个问题
RTO重传定时器的计算
应略大于RTT
如何测量RTT
因为重传会有几种情况,导致RTT计算比较困难
RTT测量的第2种方法
RTO应当设多大
RTO应该更平滑
追踪RTT方差
linux系统使用这种方式计算RTO
TCP滑动窗口
发送窗口的快照如下图
收到ack确认,同时窗口大小没动,就移动5个字节
?
接收窗口
约等于对端发送窗口的接收窗口
为什么是约等于:
实际上滑动窗口并不是一成不变的,如果接收窗口的应用程序接收数据很快,接收窗口可以很快空出来,需要通过tcp报文的windows size传递,是有时延的
滑动窗口示例:MSS不产生影响,窗口不变
客户端消息的发送
服务器端消息的发送
操作系统缓冲区和滑动窗口的关系
t缓冲区影响接收窗口的大小,而系统内存的改变会影响缓冲区的大小
应用层没有及时读取缓存
应用程序没有及时从缓冲区读取数据,导致缓冲区可接收数据变少,导致窗口收缩
接收窗口逐渐关闭
收缩窗口导致丢包
但操作系统一般不会发生这种情况
一般都会先收缩窗口再减少缓冲区大小
窗口关闭后,定时探测窗口大小
飞行中报文的适合数量
linux下调整接收窗口与应用缓存
linux下对tcp缓冲区的调整方式
如何减少小报文提高网络效率 SWS 糊涂窗口综合症
SWS避免算法
tcp 延迟确认
linux上更为激进的Nagle: TCP_CORK
需要结合sendfile零拷贝技术使用
?
全局思考:拥塞控制 慢启动
通告窗口是对方接收窗口
慢启动的初始窗口
拥塞避免
先慢启动,达到阈值后进入拥塞避免,线性方式增加,如果发生了丢包会重新接入慢启动阶段 并且阈值也会变为之前的一半。??
快速重传与快速恢复
当丢包并不是很严重时,可以进入快速重传与恢复
失序数据段
什么是失序数据段
pkt1丢失了
快速重传
当收到3个重复失序ACK段时,立刻基于快速重传机制重发报文段
超时不会启动快速重传
快速重传下一定要进入慢启动吗?
快速恢复
SACK与选择性重传算法
当报文5丢失后,接收方会重复发ack5,表示我还需要报文5,但是发送端把报文6,7,8也发了,收到的是ack5。?
发送方想知道6,7,8到底有没有传过去呢?
仅重传丢失段保守乐观 重传所有段-积极悲观
怎么解决上面2种方式可能带来的问题呢? SACK :tcp selective acknowledgment
简单来说会发送一个SACK来告知收到了
测量驱动的拥塞控制算法
大管道向小管道传输数据引发拥堵
BBR?
google2016年,linux4.9内核引入,QUIC使用
Google BBR拥塞控制算法原理
关闭连接过程优化
防止数据丢失,与应用层交互
两端同时关闭
tcp状态机
RST复位报文直接关闭连接,绕开四次握手
http://blog.leanote.com/post/jerrychao/TCP%E9%80%9A%E8%BF%87RST%E6%8A%A5%E6%96%87%E6%9D%A5%E5%85%B3%E9%97%AD%E8%BF%9E%E6%8E%A5
tcp的keepalive,检验和带外数据
长时间没有任何数据的连接可能关掉,2小时没有收发任何数据后开启keepalive功能,会发送多个探测包,如果收到了ack,认为是活跃的连接,会从2小时从新开始计时。反之则间隔75s再发一个,最多发送9个报文后,还没收到ack,就关闭该连接。
违反分层原则的校验和
16位2字节的校验和字段,不光对数据校验也对头部检验,实际上也对ip头部的一部分进行校验,从这个层面来说已经违反分层原则了,对ip的头部,源ip地址,目的ip地址还有协议等信息进行校验。
那为什么要对ip头部校验呢?
如果我们发现tpc segement 其实不是发给自己的,那就可以更快发现这个问题。
校验和默认是累加和,如果不够放的可以放到option
应用调整tcp发送数据的时间
psh可以调整应用发送的时机,psh=1 ,如果收到这个报文后,请缓冲区尽快把缓冲内的数据交给应用进程处理,而不是等到多少字节后再让进程处理。
紧急处理数据
紧急标志位,通常也会被叫做带外数据位,其实并不是带外数据位。在telnet中输入很多字符,字符在网络中可能拥塞,这时ctrl-c,退出了,可能会把URG=1,内核会优先处理这些数据。
?
面向字节流的TCP连接如何多路复用 多路复用
在一个信道上传输多路信号或数据流的过程和技术
一旦没有数据就立马返回不等待
epoll+非阻塞socket
epoll为什么高效
红黑树存放所有连接
当读写事件触发,把对应的连接放到链表中
每次只返回就绪的连接
?
非阻塞+epoll+同步编程=协程
上面是一个openresty的例子,当connect阻塞时(三次握手),里面的实现是发现需要等待,就切换到其他tcp连接的处理中了,等到有ack来时,激活这段代码,继续往下面执行。
?
OSI模型下的七层LB与四层LB
?
UDP负载均衡的理论依据
以五元组来做负载均衡
?
?
?
《tcp数据包,tcp协议抓包分析代码》来自互联网同行内容,若有侵权,请联系我们删除!
还没有评论,来说两句吧...