用户态协议栈之TCP滑动窗口

1、tcp协议头

URG:置为1时,使用紧急 Urgent Pointer指针指向的内容直接给应用层使用

2、三次握手

三次握手如何实现的:状态机。

多个客户端同时请求:每一个客户端都有一个状态机。

如何标识每一个客户端:五元组(source ip、source port、dest ip、dest port、protocol)。

五元组从哪里获取:对方发送的ip头与tcp头。

accept()函数:申请client fd,并将该client fd和accept队列中的一个tcb块绑定。

状态机状态存在tcb里面,五元组也存在tcb。

listen(fd,backlog)中的参数---backlog:半链接队列和全链接队列的总和长度。或者 半连接队列的长度(linux下)。

ddos如何防范?
dos攻击客户端不断发送第一次syn数据包,后面不发,服务端半链接队列会满。
策略1:backlog调小,超时释放tcb
策略2:防火墙

三次握手,如果最后一次ack丢失,怎么办?
服务端syn-ack包不会重发,只会tcb超时释放tcb

服务端只有listen之后,才允许三次握手。

socket fd提供外界用来关联链接, 底层操作是tcb控制快。

tcp包头里没有总tcp包长度?

因为ip包里有总长度。ip层要保证tcp包的完整性。

为什么udp头里有UDP包的总长度?

其实不用该包头长度字段也可以的。

RTT:
客户端记录发出syn包到发出ack包时间
服务端记录收到syn包到收到ack包时间
三次握手时候,就已计算好。每次都计算
RTT = rtt0;//三次握手
RTT1 = rtt1; //
RTTn = RTT(n-1)*0.1 + oldRTT*0.9;//消抖

3、tcp传输:

 

初始化1个包,在对方windows没有限制情况下,后指数增长发包的数量。

初始化定义慢启动到线性增长的阈值是16k。

对方接受数据回ack的包的时间超过rtt时间,这时候网络拥塞,发送包的数量就变为当前发送包的数量的1/2,再线性增长。

在对方window有限制情况下,是红色线条情况。

4、 tcp 如何保证顺序

1)、应答机制,发一个包,回一个包,速度慢。
2)、多个包一起发,再等待确认,提升速度。

第二种方案,可能会有先发的包后到:

如何保证顺序,采用超时重传机制。

如上图,接受端收到一个顺序包置定时器200ms,收到下一个顺序包重值定时器200ms,8号包没收到,9号包和10号包都到了不会设置定时器,定时器超时,向发送端发送ack包其中ack_seq=8,同时窗口移动。

5、tcp缺点

1)、重传数据多。
2)、实时性不强,等待ack延迟,延迟确认,延迟确认为了将下一次发送的包带过去。

6、tcp中的定时器

三次握手中有定时器。
传输数据时有定时器。
4个定时器+其他定时器。

1)、超时重传,发送数据到对端,规定时间内没收到对端的数据,重传发送
2)、探测定时器,也叫坚持定时器,对端的win=0,发送端发送push=1,探测到底能不能发
3)、keeplive,长时间不发数据,tcp 发送保活包,一般不建议使用,超时后,自动回收资源(回收tcb,fd)应用层无法感知的,建议应用层自己开定时器,定时给客户端发tcp包,保活tcp链路
4)、time_wait,四次挥手,避免最后ack丢失,保证对端的socket fd可以关闭

 坚持定时器:

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值