网络编程面试题(一)三握四挥拥塞控制

TCP

一个面向连接的,可靠的传输协议

一,socket与tcp协议栈之间的关联

三次握手:

1,客户端连接服务器:
服务端此时处于listen状态,客户端发送:
syn和序列号seq12345.
2,服务器回应客户端:
确认ack和acknum=12346
syn和seq-3214
3,客户端回应服务器
ack和acknum=3215
在这里插入图片描述
acknum:表示这个数字以前的全部确认完成。
客户端与服务器在这个过程中总共产生两次交互。

第一次交互:

服务端侧会形成一个syn队列,队列上会生成一个tcb节点,而这个节点会存在于tcp的整个生命周期,它包含了send_buffer和receive_buffer。服务端每服务一个客户端,就会生成一个这样的tcb节点。

第二次交互:

服务端会生成一个accept队列,在syn队列中寻找刚刚连接的tcb,并把它放到accept队列。
在这里插入图片描述
此时三次握手结束,开始调用accept()函数,这个函数不是复制,而是从accept队列中,取出一个三次握手完成的节点,并且为这个节点分配一个socket(clientfd)。

那socket是如何从syn队列中找到最新连接的tcb呢?是通过寻找五元组的方式找到tcb的:
哪五元:(源IP,目的IP,源端口、目的端口、协议)
(sip,dip,sport,dport,proto)
源端口目的端口,都是端口号,端口号:0~65535

调用send()时:buffer->tcb.sendbuffer//把用户空间的数据放到tcb的sendbuffer中。
调用receive()时:tcb.receivebuffer->buffer//与send()相反

三次握手成功后,会开辟资源,在内核中维护两个队列——发送队列和接受队列。这些资源只给连接使用。

TCP如何保证顺序传输

那么如何确定包到没到呢?
延迟ACK:
每收到一个包,就会启动一个定时器,在定时周期之内,如果有新的包到了,就重置定时器。
假如:
1号包到了,2号包到了,5号包到了,10号包到了,其他的包都没有到。这个时候,定时器超时了。

此时:
会回哪个ACK呢?
会回一个3号包的ACK,也就是说,2号包以后,全部重传。

TCP的拥塞控制算法

1,慢开始 2,拥塞避免 3,快重传 4,快恢复

通过三次握手计算出RTT。
RTT=0.9RTT0+0.1RTT1
下一次是RTT的时间依赖于前两次的RTT数值。
***慢启动:***先发送一个包,如果在RTT内回来了,下次发送2个包。如果这两个包还在RTT内回来,下次就发4车依次类推。
如果发了32车,没有在RTT内回来,则回到之前的一半,从24开始,如果24包在RTT内回复,则发28个,没达到,则发20个。(每次发送方收到确认后啊,拥塞窗口加倍,指数增长)
***拥塞避免:***每个传输轮次,拥塞窗口线性加一,如果报文段的重传计时器超时了,那么将重置拥塞窗口和阈值,重新开始慢开始算法。
***快重传:***(有时个别报文段会丢失,但实际上网络并没有拥塞,会导致发送方超时重传,并误认为网络拥塞了,此时又重回慢开始状态,从而降低了传输效率)。
当接收端收到比期望序号更大的报文段时,会重复发送最近一次确认的报文段的确认信号。比如ACK2丢了,每次接受到新的包都会回复ACK2。如果接收端连续收到4个(1个正常3个冗余)的ACK,则重发对应的ACK。
在这里插入图片描述
应用实例。

在这里插入图片描述
快恢复:
和快重传配对使用:如果发送方收到了3个重复确认,就知道现在只是丢失了个别的报文段,于是不启动慢开始算法,而是执行快恢复算法:发送窗口不重置成1,而是一个阈值ssthresh,这个阈值是最大窗口的二分之一。
在这里插入图片描述

四次挥手

在这里插入图片描述

一方主动释放,另一方被动释放:客户端和服务端都可以发起释放。
发送方:发FIN=1,seq=u(发出释放连接报文,并停止发送数据,进入FIN-WAIT-1)
接受方:回ACK=1,seq=v,ack=u+1(发出确认报文ACK和ack=u+1,带上自己的序列号seq,进入ClOSE—WAIT)
发送方:收到接收方确认,进入FIN-WAIT2(终止等待2)状态
接收方:发送完最后的数据,向发送方发送释放连接的报文FIN=1,ACK=1,seq=w,ack=u+1
发送方:发出确认,ACK=1,ack=w+1,seq=u+1,进入TIME-WAIT状态,经过2MSL(最长报文段寿命),客户端撤销TCB,进入关闭状态。
接收方:接收到了发送方的确认,进入关闭状态。

TIME_WAIT的作用:防止最后发送回去的包丢失。如果接收方没有接收到ACK,就会一直回发FIN。所以发送方不能立刻关闭,他必须确认接收方收到了该ACK,如果在该时间内再次收到FIN,那么发送方会重发ACK并再次等待2MSL,MSL就是一个发送和回复所需的最大时间,如果2MSL之后,发送方都没有再次收到FIN,那么发送方会判断ACK已经被成功接收,并断开连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值