面试早准备之 TCP那些事

编程不秃头,还能交朋友,大家好,我是你们的好朋友,毛哥。

今天给大家分享一下面试过程中关于TCP的那些事

什么是TCP?
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通讯协议,是为了在不可靠的互联网上提供端到端字节流而专门设计的一个传输协议。
TCP的报文格式
在这里插入图片描述
TCP的三次握手

客户端发送SYN(SEQ = x)报文给服务端,进入SYN_SED状态。
服务器接收到SYN报文,回应一个SYN(SEQ = y),ACK(ack = x+1)报文
客户端接收到服务器端的SYN报文,回应ACK(ack =y+1报文,进入Establish状态。
三次握手完成,TCP客户端和服务器端成功创建连接,可以开始传输数据。

TCP的四次挥手

客户端请求断开,发送FIN和自己的序列号 SEQ = u,进入FIN-WAIT-I状态。
服务器接收到客户端的断开请求后,发送ACK确认标志和客户端的确认号ack = u + 1,以及自己的序列号 SEQ = v,进入CLOSE_WAIT状态。
客户端收到服务器确认结果后,进入FIN-WAIT-II状态。
之后服务器再发送释放信号FIN,确认标志ACK ,确认序列号ack = u + 1,以及自己的序列号 SEQ = w,服务器进入LAST-ACK(最后确认状态)。
客户端收到回复后,发送确认标志ACK,确认序列号 ack = w + 1;以及自己的序列号 ,客户端进入TIME-WAIT(时间等待)状态,客户端经过2MSL(2个最大报文段寿命)后,客户端CLOSE.
服务器收到确认标志ACK后,立刻进入CLOSE状态。

为什么是三次挥手,四次握手
三次挥手时,服务器同时把确认信号ACK和连接信号SYN一起发送给客户端,完成了双方的状态准备以及双方状态的确认工作。
四次挥手时,服务器收到 客户端的释放信号FIN,仅仅表示客户端不再发送数据了,但是还能接受数据。服务器是否关闭数据发送通道,需要由上层应用来决定,因此服务器一般会将ACK和FIN分开发送。

为什么不能用两次握手进行连接?
若使用两次握手,则可能无法确认双方的状态,从而导致死锁。
例如,计算机S和C之间进行通信,假定C给S发送一个连接请求,S收到后发送了确认应答。但是若S的确认应答报文丢失,C就不知道S是否已经准备好了,认为连接没有成功,将忽略S发送过来的其他任何数据信息,只等待连接确认信息,而S在发送分组超时后,会重复发送,这样就形成了死锁。

为什么客户端最后需要等待2ML?
客户端需要保证最后一次发送的ACK报文送达服务器。如果服务器没有收到,则会重新发送FIN。这样客户端就有时间在发送ACK,并重新计时,直到服务器收到,双方进入CLOSE状态。
确保网络中不存在其他的报文,不影响重新建立连接。

TCP保证可靠性的机制有哪些?
1、序列号
2、确认号ack
3、超时重传机制
当报文发出后在一定的时间内未收到接收方的确认,发送方就会进行重传(通常是在发出报文段后设定一个闹钟,到点了还没有收到应答则进行重传)
4、流量控制
接收端处理数据的速度是有限的,如果发送方发送数据的速度过快,导致接收端的缓冲区满,而发送方继续发送,就会造成丢包,继而引起丢包重传等一系列连锁反应。 因此TCP支持根据接收端的处理能力,来决定发送端的发送速度,这个机制叫做流量控制。
在TCP报文段首部中有一个16位窗口长度,当接收端接收到发送方的数据后,在应答报文ACK中就将自身缓冲区的剩余大小,放入16窗口大小中。这个大小随数据传输情况而变,窗口越大,网络吞吐量越高,而一旦接收方发现自身的缓冲区快满了,就将窗口设置为更小的值通知发送方。如果缓冲区满,就将窗口置为0,发送方收到后就不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。
5、拥塞控制是防止过多的数据注入网络中,使网络中的路由器或者链路避免过载。主要有慢启动、拥塞避免、快重传、快回复四种方式。

慢启动:先将拥塞窗口cwnd设置为1个最大报文段(MSS)的数值。而在每收到一个新的报文确认后,将拥塞窗口翻倍,即成指数增长。

拥塞避免:当慢启动达到慢启动阈值后,让拥塞窗口cwnd缓慢增大即每次增加1个,而不是加倍。一旦网络出现超时,就将cwnd设置为1,慢启动阈值设置为现在cwnd的一半,然后重新执行慢启动。
在这里插入图片描述
快重传:要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即重传。一旦发送方收到3个连续的重复确认,就将相应的报文立即重传。
快恢复:当出现快重传时,将慢启动阈值ssthresh减半。由于发送方会认为现在网络没有拥堵,因此现在不执行慢启动算法,而是把cwnd值设置为慢启动阈值ssthresh减半之后的数值,然后开始执行拥塞避免算法。

如果学习更多TCP相关知识,可以阅读《图解TCP/IP》这本书,关注微信公众号”编程不秃头“并回复“ 图解TCP/IP ”,即可获得相应的PDF版资源。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值