计算机网络之TCP协议详解

  • Post author:
  • Post category:其他




系列文章目录

第一章

计算机网络之http协议详解


第二章

计算机网络之https协议详解


第三章

计算机网络之TCP协议详解





前言

TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层协议。它提供了数据传输的可靠性和有序性,并能够进行流量控制和拥塞控制。TCP的特点是通过三次握手建立连接,通过四次挥手结束连接;数据传输时采用滑动窗口机制,保证数据的可靠性;同时具有拥塞控制和流量控制的功能,在网络中起到了重要的作用。TCP常被用作应用层协议(如HTTP、FTP等)的底层传输协议。——by chatgpt

tcp协议学就完了,伙计。




TCP 传输控制协议

——Transmission Control Protocol

可靠的、面向连接的协议

传输效率低

面向连接体现在:三次握手、四次断开

可靠性体现在:序列号、确认号、计时器(包括重传、保活、时间等待等)



TCP的封装格式

tcp的封装格式

  • 序列号:数据段标记,用于到目的端对到达包重组

    确认号:告诉发送端这个序号之前的数据段都收到了

    控制位:

    URG:紧急指针有效位,与16位紧急指针配合使用 –urgent

    ACK:确认号,确认时为1 –acknowledgement

    PSH:通知接收端立即将数据提交给用户进程,不在缓存中停留,等待更多的数据 –push

    RST:重置,为1时请求重新连接 –reset

    SYN:同步,为1时请求建立连接 –sync

    FIN:断开,为1时请求断开连接 –FIN

    滑动窗口:指明本地可接收数据的字节数,最多65535



三次握手

一般都是客户机发起,但也有例外,如webhook:将信息推给用户

简述TCP协议的三次握手以及为什么2次握手不行_必看吧的博客-CSDN博客

seq为序列号,ack为确认应答号,等于收到报文段的seq+1

客户端和服务器各自有一个随机的初始序列号

第三次握手时,SYN=0,seq虽然+1,但因为ACK报文段没有携带数据所以并

不会消耗序号

,下一个数据报文段的序号仍然是seq=x+1

​ ack包携带序列号,但不携带数据就不占用序列号,不需要回复的包 基本不占用序列号

  • 对于序列号:单调递增,初始序列号随机生成ISN=M+md5(四元组),M与操作系统有关,一般单调递增,便于区分前后请求包

    ​ 后面的ISN=初始序列号+第一个字节偏移量,即第n个包的ISN-第(n-1)个包的ISN=第(n-1)个包的字节数

    ​ 随机初始序列号是从安全性出发,黑客不会那么容易猜到ISN,防止其伪造一些确认序列包,从而对服务器发起攻击

    ​ 序列号会回绕 ,到达尽头的时候,序列号会从0开始


为什么需要三次握手,而不是两次?


三次握手才能确立两方都已经准备好了,

如果两次握手,客户端没有收到来自服务器端的syn+ack包,而服务端又已经发送了

那服务端认为我发了,客户端认为服务器没有发送,最后可能要等到客户机重传计时器时间到了才能重新建立连接,或者客户机中断了等待,那服务器一直等着,就会

形成死锁

,当然服务器也会等待一定时间后自动断开,但还是浪费了许多服务器资源



四次断开/四次挥手

客户机和服务器都可以发起断开

四次断开

2MSL:2倍最长报文段寿命 –Maximum Segment Lifetime

​ 不同的系统可能不同,而且有时候理论上最长4分钟左右,但实际上可能也就一分多钟


为什么不是3次,是4次?

服务器可能还有数据没发完


当我们连接上nginx服务的网站,点击关闭网站后,是谁主动发起四次断开?

服务器端

当我们关闭网站时,客户机并不知道,也并不会发起断开

当服务器的保活计时器超时时发出探测数据段都没有回应时,服务器发起断开



计时器



重传计时器——为了控制丢失的数据段

发送方在重传计时器超时之前没有接收到ack,重传数据,并将重传计时器复位,超时前收到就撤销重传计时器



坚持计时器——为了防止零窗口死锁

用于处理TCP发送端的流量控制​ ——Persist Timer

当TCP发送方向接收方发送数据时,如果接收方的接收缓冲区已满,那么发送方就不能继续发送数据,否则数据包会被丢弃。为了避免这种情况,TCP发送方会定期发送一个只包含一个字节的特殊探测报文段(也称为Keep-Alive报文段),以检测接收方的接收窗口是否已经打开。如果发送方在等待接收方发送窗口更新时过长时间没有收到任何响应,那么它就会启动坚持计时器。坚持计时器定期发送探测报文段,直到接收方响应为止,从而确保在连接处于空闲状态时也能保持连接的状态。



保活计时器——防止两个TCP之间的连接长时间的空闲

server端在保活计时器超时前没有收到客户端发来的数据,就发送探测数据段,发了 10 个还没响应就断开连接

centos的nginx配置一般为65秒



时间等待计时器

连接中止期间使用,在发送最后一个ACK之后,不立即断开连接,而是等待一段时间(2MSL),保证能够接收到重复的FIN数据段



TCP的流控机制



滑动窗口——网络不堵的情况

指本机缓存里能接受多少数据

Win,滑动窗口的大小,指明本地可接收数据的字节数

当缓冲区满了就不在接收数据,



拥塞窗口——拥塞控制

是中间的传输网络的带宽的反馈

Cwnd –crowd 拥挤

四个算法:慢启动、拥塞避免、拥塞发生、快速恢复

拥塞控制

1-5分别是慢启动、拥塞避免、拥塞发生、拥塞避免、快速恢复

慢启动只是开始没,但会指数增长



差错控制



效验和

效验和不对就丢掉



版权声明:本文为fruitless原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。