计算机网络TCP/UDP知识点

devtools/2024/11/9 17:08:01/

这是一些在学习过程中关于计算机网络八股文的一些知识点记录:

TCP/UDP

TCP怎么保证可靠性

1.序列号,确认应答,超时重传

数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明了它下一次需要接收的数据序列号。如果发送发迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传。这个时间一般是2*RTT(报文段往返时间)+一个偏差值。

2.窗口控制与高速重发控制/快速重传

TCP会利用窗口控制来提高传输速度,意思是在一个窗口大小内,不用一定要等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值。如果不使用窗口控制,每一个没收到确认应答的数据都要重发

简述一下TCP建立连接与断开连接的过程

在这里插入图片描述

注意:要注意到每一步他们的状态变化。

下面就有一个状态变化图:
在这里插入图片描述

ESTABLISHED: 表示连接已经建立。三次握手完成

FIN_WAIT_2: 主动关闭链接的一方,发出 FIN 收到 ACK 以后进入该状态。 称之为半连接或半关闭状态。 该状态下的 socket 只能接收数据,不能发。

TIME_WAIT: 表示收到了对方的 FIN 报文,并发送出了 ACK 报文,等 2MSL 后即可回到 CLOSED 可用状态。主动发起连接的才会处于该状态…等 2MSL 的目的是确保主动关闭端发送的最后一个 ACK 能到达对端…TIME_WAIT 的时长是 2MSL,不要说 1min,2min 之类的!!!

TCP的三次握手和四次挥手的原因是什么?

为什么三次握手?
  1. 三次握⼿才可以阻⽌重复历史连接的初始化(主因):比如当旧的SYN报文在某一网络节点长时间滞留,在到达服务端时,客户端可以通过自己上下文判断这个是一个历史连接(序列号过期或超时),会发送一个RST,终止连接。如果是两次连接的话两次握⼿在收到服务端的响应后开始发⽣数据,不能判断当前连接是否是历史连接。 三次握⼿可以在客户端准备发送第三次报⽂时,客户端因有⾜够的上下⽂来判断当前连接是否是历史连接
  2. 三次握⼿才可以同步双⽅的初始序列号:两次握⼿只保证了⼀⽅的初始序列号能被对⽅成功接收,没办法保证双⽅的初始序列号都能被确认接收。
  3. 三次握⼿才可以避免资源浪费:两次握⼿会造成消息滞留情况下,服务器重复接受⽆⽤的连接请求 SYN 报⽂,⽽造成重复分配资源只有两次握⼿时,如果客户端的SYN请求连接在⽹络中阻塞,客户端没有收到服务端的ACK报⽂,会重新发送SYN由于没有第三次握⼿,服务器不清楚客户端是否收到了⾃⼰发送的建⽴连接的 ACK 确认信号,所以每收到⼀个SYN 就只能先主动建⽴⼀个连接
为什么是四次挥手?

TCP协议是全双工通信,这意味着客户端和服务器端都可以向彼此发送数据,所以关闭连接是双方都需要确认的共同行为。所以客户端收到FIN报⽂,先回⼀个ACK应答报⽂,服务端可能还要数据需要处理和发送,等到其不再发送数据时,才发送FIN报⽂给客户端表⽰同意关闭连接。所以服务端的ACK和FIN⼀般都会分开发送,从⽽⽐三次握⼿导致多了⼀次

假设是三次挥手时,首先释放了A到B方向的连接,此时TCP连接处于半关闭(Half-Close)状态,这时A不能向B发送数据,而B还是可以向A发送数据。如果此时A收到了B的确认报文段后,就立即发送一个确认报文段,这会导致B向A还在发送数据时连接就被关闭。这样会导致A没有完整收到B所发的报文段

TCP,UDP的区别是什么?

  1. TCP是面向字节流,UDP面向的是数据报的
  2. TCP是面向连接的,UDP是面向无连接的
  3. TCP可以保证数据安全有序,UDP不保证
  4. TCP复杂,UDP程序简单
  5. TCP只能单对单,点对点,UDP支持一对一,一对多,多对多通信
  6. TCP⾸部长度不适⽤选项字段是20字节,使⽤选项字段长度增加(可变),UDP⾸部固定8字节。
  7. TCP数据⼤于MSS时会在TCP层将数据进⾏分⽚传输,到达⽬的地后同样在传输层进⾏合并,如果有某个⽚丢失则只需要重传丢失的分⽚即可; UDP数据⼤于MTU时会在IP层分⽚,同样也在⽬的IP层合并,如果某个IP分⽚丢失,则需要将所有分⽚都进⾏重传,开销⼤

TCP,UDP的优缺点是什么?

TCP优点:

可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。

TCP缺点:

慢,效率低,占用系统资源高,易被攻击 TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。

UDP优点:

快,比TCP稍安全 UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。

UDP缺点:

不可靠,不稳定 因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。

TCP、UDP适用的场景?

TCP应用场景

效率要求相对低,但对准确性要求相对高的场景。因为传输中需要对数据确认、重发、排序等操作,相比之下效率没有UDP高。举几个例子:文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、远程登录

UDP应用场景

效率要求相对高,对准确性要求相对低的场景。举几个例子:QQ聊天、在线视频、网络语音电话

TCP相比UDP为什么是可靠的?

1.确认和重传机制:建立连接时三次握手同步双方的“序列号 + 确认号 + 窗口大小信息”,是确认重传、流控的基础传输过程中,如果Checksum校验失败、丢包或延时,发送端重传。

2.数据排序:TCP有专门的序列号字段

3.流量控制:窗口和计时器的使用。TCP窗口中会指明双方能够发送接收的最大数据量

4.拥塞控制:TCP的拥塞控制由4个核心算法组成。“慢启动”(Slow Start)、“拥塞避免”(Congestion avoidance)、“快速重传 ”(Fast Retransmit)、“快速恢复”(Fast Recovery)。

什么事TCP拥塞控制?以及达到什么情况的时候开始减慢增长的速度?

拥塞控制

​ 如果把窗口定的很大,发送端连续发送大量的数据,可能会造成网络的拥堵(大家都在用网,你在这狂发,吞吐量就那么大,当然会堵),甚至造成网络的瘫痪。所以TCP在为了防止这种情况而进行了拥塞控制。

慢启动

​ 定义拥塞窗口,一开始将该窗口大小设为1,之后每次收到确认应答(经过一个rtt),将拥塞窗口大小*2。

拥塞避免

​ 设置慢启动阈值,一般开始都设为65536。拥塞避免是指当拥塞窗口大小达到这个阈值,拥塞窗口的值不再指数上升,而是加法增加(每次确认应答/每个rtt,拥塞窗口大小+1),以此来避免拥塞。

​ 将报文段的超时重传看做拥塞,则一旦发生超时重传,我们需要先将阈值设为当前窗口大小的一半,并
且将窗口大小设为初值1,然后重新进入慢启动过程。

快速重传

​ 在遇到3次重复确认应答(高速重发控制)时,代表收到了3个报文段,但是这之前的1个段丢失了,便对它进行立即重传。然后,先将阈值设为当前窗口大小的一半,然后将拥塞窗口大小设为慢启动阈值+3的大小。

这样可以达到:在TCP通信时,网络吞吐量呈现逐渐的上升,并且随着拥堵来降低吞吐量,再进入慢慢
上升的过程,网络不会轻易的发生瘫痪。

采用慢开始和拥塞避免算法的时候

  1. 一旦cwnd>慢开始门限,就采用拥塞避免算法,减慢增长速度
  2. 一旦出现丢包的情况,就重新进行慢开始,减慢增长速度

采用快恢复和快重传算法的时候

  1. 一旦cwnd>慢开始门限,就采用拥塞避免算法,减慢增长速度
  2. 一旦发送方连续收到了三个重复确认,就采用拥塞避免算法,减慢增长速度

OSI与TCP模型

在这里插入图片描述

TCP/IP数据链路层的交互过程是怎么样的?

​ 网络层等在数据链路层用MAC地址作为通信目标,数据包到达网络层等往数据链路层发送的时候,首先回去ARP缓存表去查找ip对应的MAC地址,如果查到了,就将此ip对应的MAC地址封装到链路层数据包的包头。如果缓存中没有找到,则会发起一个广播,who is ip xxx tell ip xxxx,所有收到广播的机器看到这个ip是不是自己的,如果是自己的,则以单播的形式将自己的mac地址回复给请求机器。

传递到IP层怎么知道报文该给哪个应用程序,它怎么区分UDP报文还是TCP报文?

根据端口号可以查看区分需要接受到的程序;

根据IP协议头中的标识字段:UDP 17、TCP 6

请说说你对TCP连接中time_wait状态的理解

time_wait是如何产生的

​ 首先调用close()发起主动关闭的一方,在发送最后一个ACK之后会进入time_wait的状态,也就说该发送方会保持2MSL时间之后才会回到初始状态。MSL值得是数据包在网络中的最大生存时间。产生这种结果使得这个TCP连接在2MSL连接等待期间,定义这个连接的四元组(客户端IP地址和端口,服务端IP地址和端口号)不能被使用。

time_wait状态产生的原因是:
1.实现TCP全双工连接的可靠释放

​ 假设发起主动关闭的一方(client)最后发送的ACK在网络中丢失,由于TCP协议的重传机制,执行被动关闭的一方(server)将会重发其FIN,在该FIN到达client之前,client必须维护这条连接状态,也就说这条TCP连接所对应的资源不能被立即释放或重新分配,直到另一方重发的FIN达到之后,client重发ACK后,经过2MSL时间周期没有再收到另一方的FIN之后,该TCP连接才能恢复初始的CLOSED状态。如果主动关闭一方不维护这样一个TIME_WAIT状态,那么当被动关闭一方重发的FIN到达时,主动关闭一方的TCP传输层会用RST包响应对方,这会被对方认为是有错误发生,然而这事实上只是正常的关闭连接过程,并非异常。

2.防止具有相同四元组的旧数据包被收到

​ 经过 2MSL 这个时间,⾜以让两个⽅向上的数据包都被丢弃,使得原来连接的数据包在⽹络中都⾃然消失,再出现的数据包⼀定都是新建⽴连接所产⽣的。

time_wait过多的危害:

1.内存资源占用;

2.对端口资源的占用,一个TCP连接至少消耗一个本地端口;

如果发起连接⼀⽅的 TIME_WAIT 状态过多,占满了所有端⼜资源,则会导致⽆法创建新连接。

time_wait状态的避免

首先服务器可以设置SO_REUSEADDR套接字选项来通知内核,如果端口忙,但TCP连接位于TIME_WAIT状态时可以重用端口。在一个非常有用的场景就是,如果你的服务器程序停止后想立即重启,而新的套接字依旧希望使用同一端口,此时SO_REUSEADDR选项就可以避免TIME_WAIT状态。

为什么要设置time_wait

1.保证A发送的最后一个ACK报文能够到达B。也就是上面提到的保证全双工连接的可靠释放

2.A在发送完最后一个ACK报文段后,经过2MSL后,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,也就是为了防止具有相同四元组的旧数据包被收到。

针对OSI七层模型和TCP/IP四层模型,每一层都举例出一两个协议:

OSI七层协议:
  1. 物理层:通过媒介传输比特,主要包括的协议为:IEE802.3 CLOCK RJ45
  2. 数据链路层:将比特组装成帧和点到点的传递,传输单位为,主要包括的协议为MAC VLAN PPP
  3. 网络层:负责数据包从源到宿的传递和网际互连,传输单位为,主要包括的协议为IP ARP ICMP
  4. 传输层:提供端到端的可靠报文传递和错误恢复,传输单位为报文,主要包括的协议为TCP UDP
  5. 会话层:建立、管理和终止会话,传输单位为SPDU,主要包括的协议为RPC NFS
  6. 表示层:对数据进行翻译、加密和压缩,传输单位为PPDU,主要包括的协议为JPEG ASII
  7. 应用层:允许访问OSI环境的手段,传输单位为APDU,主要包括的协议为FTP HTTP DNS
TCP/IP四层协议:
  1. 网络接口层

  2. 网络层:IP协议、ICMP协议、ARP协议、RARP协议。

  3. 传输层:UDP协议、TCP协议

  4. 应用层:FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送 协议),POP3协议(邮局协议),HTTP协议


http://www.ppmy.cn/devtools/92278.html

相关文章

系统架构设计师备考攻略

目录 一、考试介绍 1.1 背景介绍 1.2 报名条件 二、系统架构设计师证书好处 三、学习方法 3.1 基础知识 3.2 案例分析 3.3 论文 3.4 总结 系统架构设计师专栏(传送门) 学习路线导航栏 八大架构导航栏 论文写作导航栏 一、考试介绍 1.1 背景介绍 计算机软件资格…

【Go】HTTP编程4-请求校验 validator

常见的网站攻击 1 XSS (Cross-Site Scripting ) 跨站脚本攻击 为什么不叫css ,为了和 前段的css 区分 通过注入脚本获取敏感信息 2 CSRF ( Cross-site request forgery )跨站请求伪造 3 jsonp https://blog.b…

几个被淘汰的Python库,请不要再用!

随着 Python 版本的不断更新,许多旧库逐渐被更现代和高效的库所取代。作为新手程序员,掌握这些新的工具非常重要。 在这篇文章中,我们将详细介绍几个不推荐使用的 Python 库,并提供具体的代码示例及详细注释,以帮助你…

微信小程序如何保证数据的安全性和稳定性

微信小程序在保证数据的安全性和稳定性方面,采取了多种措施,以确保用户信息的安全和系统运行的稳定。以下是详细的分析: 数据安全性保障措施 HTTPS协议: 微信小程序所有的网络请求都必须通过HTTPS协议进行。HTTPS协议是HTTP协议的…

Html详解——Vue基础

HTML是什么? 超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用来结构化 Web 网页及其内容的标记语言。网页内容可以是:一组段落、一个重点信息列表、也可以含有图片和数据表…

深度学习的前沿技术有哪些?

深度学习的前沿技术包括生成对抗网络(GANs)、深度强化学习(Deep Reinforcement Learning)和自监督学习(Self-supervised Learning)。 1. 生成对抗网络(GANs): 生成对抗…

Redis实战:高效键值存储与缓存解决方案

Redis实战:高效键值存储与缓存解决方案 在现代应用程序架构中,Redis作为一个高性能的键值存储系统,因其灵活性和速度而广受青睐。本文将深入探讨Redis的核心特性和实战应用,同时介绍如何利用itBuilder这样的数据库设计工具来优化…

QT移除窗体的最大化和最小化按钮

效果 代码位置 代码 int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.setWindowFlags(w.windowFlags() & ~Qt::WindowMaximizeButtonHint & ~Qt::WindowMinimizeButtonHint);w.show();return a.exec(); }