针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。
目录
8.什么是TCP拥塞控制?以及达到什么情况的时候开始减慢增长速度?
11.传递到IP层怎么知道报文该给哪个应用程序,他怎么区分UDP报文还是TCP报文
16.什么是OSI七层模型和TCP/IP四层模型?每层列举2个协议。
18.搜索baidu,会用到计算机网络中的什么层,每层是干嘛的?
1.TCP怎么保证可靠性?
序列号和确认应答:
每个数据包都有唯一的序列号,接收方收到后发送确认应答(ACK),确保数据按序到达。
校验和:
每个数据包包含校验和,接收方验证数据完整性,若出错则丢弃并要求重传。
超时重传:
发送方未收到ACK时,会重传数据包,防止数据丢失。
流量控制:
通过滑动窗口机制,接收方动态调整发送方的发送速率,避免接收方缓冲区溢出。
拥塞控制:
使用慢启动、拥塞避免、快速重传和快速恢复等算法,防止网络过载。
连接管理:
通过三次握手建立连接,四次挥手终止连接,确保通信双方同步。
数据重排序:
接收方根据序列号重新排序数据包,确保数据按正确顺序交付。
1.序列号、确认应答、超时重传
数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明了它下一次需要接收的数据序列号。如果发送发迟迟未收到确认应答,那么可能是发送的数据丢失也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传。这个时间一般是2*RTT(报文段往返时间)+一个偏差值。
2. 窗口控制与高速重发控制/快速重传(重复确认应答)
TCP会利用窗口控制来提高传输速度,意思是在一个窗口大小内,不用一定要等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值。如果不使用窗口控制,每个没收到确认应答的数据都要重发。
使用窗口控制,如果数据段1001-2000丢失,后面数据每次传输,确认应答都会不停地发送席号头1001的应答,表示我要接收1001开始的数据,发送端如果收到3次相同应答,就会立刻进行重发但还有种情况有可能是数据都收到了,但是有的应答丢失了,这种情况不会进行重发,因为发送端知道,如果是数据段丢失,接收端不会放过它的,会疯狂向它提醒....
2.简述一下TCP建立连接和断开连接的过程TCP
TCP建立连接和断开连接的过程
第一次握手:
客户端:客户端向服务器端发起连接请求将报文中的SYN字段置为1,生成随机序号x,seq=x 服务器端:接收客户端发送的请求数据,解析tcp协议,校验SYN标志位是否为1,并得到序号 x 第二次握手:
服务器端:给客户端回复数据
回复ACK, 将tcp协议ACK对应的标志位设置为1,表示同意了客户端建立连接的请求 回复了 ack=x+1, 这是确认序号 x: 客户端生成的随机序号 1: 客户端给服务器发送的数据的量, SYN标志位存储到某一个字节中, 因此按照一个字节计算,表示客户端给服务器发送的1个字节服务器收到了。 将tcp协议中的SYN对应的标志位设置为 1, 服务器向客户端发起了连接请求 服务器端生成了一个随机序号 y, 发送给了客户端 客户端:接收回复的数据,并解析tcp协议
校验ACK标志位,为1表示服务器接收了客户端的连接请求
数据校验,确认发送给服务器的数据服务器收到了没有,计算公式如下:
发送的数据的量 = 使用服务器回复的确认序号 - 客户端生成的随机序号 ===> 1=x+1-x
校验SYN标志位,为1表示服务器请求和客户端建立连接
得到服务器生成的随机序号: y
第三次握手:
客户端:发送数据给服务器
将tcp协议中ACK标志位设置为1,表示同意了服务器的连接请求 给服务器回复了一个确认序号 ack = y+1 y:服务器端生成的随机序号 1:服务器给客户端发送的数据量,服务器给客户端发送了ACK和SYN, 都存储在这一个字节中 发送给服务器的序号就是上一次从服务器端收的确认序号因此 seq = x+1 服务器端:接收数据, 并解析tcp协议
查看ACK对应的标志位是否为1, 如果是1代表, 客户端同意了服务器的连接请求
数据校验,确认发送给客户端的数据客户端收到了没有,计算公式如下:
给客户端发送的数据量 = 确认序号 - 服务器生成的随机序号 ===> 1=y+1-y
得到客户端发送的序号:x+1 如下为三次握手的大致流程,个人总结
TCP协议,研究对象主要是客户端和服务器端,1.客户端发送SYN=1,seq=x;2.服务器端回复SYN=1,ack=x+1,seq=y,ACK=1;3.后续客户端发送seq=x+1 ACK=1 SYN=1 ack=y+1
3.TCP三次握手和四次挥手的原因是什么?
确保双向通信能力
三次握手通过两次SYN(同步)和两次ACK(确认),确保客户端和服务端均能正常发送和接收数据:
第一次握手:客户端证明自己能发送(SYN)。
第二次握手:服务端证明自己能接收和发送(SYN+ACK)。
第三次握手:客户端证明自己能接收(ACK)。
若只有两次握手:服务端无法确认客户端是否能接收数据,可能导致单向通信。
防止历史连接的干扰
若客户端因网络延迟重复发送SYN,三次握手可确保服务端仅响应最新的SYN。
第三次握手携带ACK:服务端可通过客户端最后的ACK判断连接有效性,拒绝旧的重复SYN包。
同步初始序列号
三次交互确保双方初始序列号(ISN)被正确同步,避免数据包因序列号混乱导致传输错误。
这意味着客户端和服务器端都可以向彼此发送数据,所以关闭连接是双方TCP协议是全双工通信,都需要确认的共同行为
假设是三次挥手时,首先释放了A到B方向的连接,此时TCP连接处于半关闭(Half-close)状态这时A不能向B发送数据,而B还是可以向A发送数据。如果此时A收到了B的确认报文段后,就立即发送一个确认报文段,这会导致B向A还在发送数据时连接就被关闭。这样会导致A没有完整收到B所发的报文段
4.TCP,UDP的区别是什么?
1.TCP 是面向连接的,UDP 是面向无连接的
2.UDP程序结构较简单
3.TCP 是面向字节流的,UDP 是基于数据报的
4.TCP 保证数据正确性,UDP 可能丢包
5.TCP 保证数据顺序,UDP 不保证
5.TCP与UDP的优缺点是什么?
TCP(传输控制协议)和UDP(用户数据报协议)是两种常用的传输层协议,各自有不同的特点和适用场景。
TCP(传输控制协议)的优缺点
优点:
可靠性高:TCP提供数据传输的确认机制,保证数据的正确到达。如果丢失数据包,会自动重传。
顺序控制:TCP保证数据按发送顺序到达接收端。
流量控制和拥塞控制:TCP能通过流量控制和拥塞控制机制有效管理网络拥堵,保证网络资源的合理使用。
连接导向:TCP在通信之前需要建立连接,确保双方都准备好数据传输。
缺点:开销大:TCP需要进行连接管理、数据确认、重传等操作,因此产生较大的网络开销和延迟。传输速度较慢:由于有可靠性机制的引入,TCP的传输速度一般比UDP慢。适用场景受限:需要连接建立和管理的特性使得TCP不适合实时性要求较高的应用。
UDP(用户数据报协议)的优缺点
优点:
速度快:UDP没有连接建立、确认和重传等过程,传输延迟低,适合需要高速传输的应用。
开销小:UDP头部简单,传输过程中不进行过多控制和管理,因此相比TCP更加轻量。
支持广播和多播:UDP支持广播和多播机制,适用于需要向多个接收者发送数据的场景。
缺点: 不可靠性:UDP没有数据确认机制,数据包可能丢失或顺序错乱,应用程序需要自行处理错误和重传。没有流量控制和拥塞控制:UDP不提供流量控制和拥塞控制,容易造成网络拥堵和数据丢失。缺乏顺序保证:UDP无法保证数据包按照发送的顺序到达接收端。
6.TCP和UDP的适应场景
TCP的适应场景
文件传输(如FTP、SFTP):需要确保文件完整性和顺序正确,任何丢失的数据都需要重传,因此需要TCP的可靠性。
网页浏览(如HTTP、HTTPS):浏览器和服务器之间的请求和响应需要确保顺序和完整性,TCP能够提供这种保障。
电子邮件(如SMTP、IMAP):邮件系统要求确保邮件内容完整并按照顺序传递,因此需要TCP的可靠性。
远程登录(如SSH、Telnet):在远程登录时,用户的每个命令和输入都需要准确传递,并且顺序必须保证,因此TCP是理想的选择。
数据库应用:数据库的查询和更新操作必须保证数据的完整性和顺序,因此通常会使用TCP。
流量管理系统:在涉及大量数据交换且对数据正确性要求很高的系统(如支付系统、财务系统)中,使用TCP协议可以确保数据传输的可靠性。
UDP的适应场景
视频和音频流(如VoIP、在线视频):视频和音频流传输需要低延迟,偶尔的丢包通常不会影响用户体验。因此UDP的快速传输和低延迟非常适合这类应用。
实时游戏:实时在线多人游戏需要快速的通信,UDP能有效降低延迟,即便偶尔丢包对游戏体验影响不大。
DNS查询:DNS查询通常非常简短且需要快速响应,因此使用UDP可以减少延迟,避免不必要的连接建立和管理。
广播和多播(如IP广播、多播视频流):UDP支持广播和多播,适用于需要向多个接收者发送相同数据的场景,如直播和在线广播。
网络设备发现(如DHCP、NTP):这些协议需要快速、低延迟的数据交换,即使有些丢包也能通过重发机制进行补偿,因此使用UDP。
传感器数据传输(如物联网设备):传感器数据的实时传输通常要求延迟低,并且不要求100%可靠性,因此UDP可以减少开销。
7.TCP相比UDP为什么是可靠的?
1.确认和重传机制
建立连接时三次握手同步双方的“序列号+确认号+窗口大小信息”,是确认重传、流控的基础传输过程中,如果Checksum校验失败、丢包或延时,发送端重传。
2.数据排序
TCP有专门的序列号SN字段,可提供数据re-order
3. 流量控制
窗口和计时器的使用。TCP窗口中会指明双方能够发送接收的最大数据量
4. 拥塞控制
TCP的拥塞控制由4个核心算法组成。“慢启动"( Slow Start)、“拥塞避免"(Congestionavoidance)、“快速重传"( Fast Retransmit)、“快速恢复"( Fast Recovery)
以上就是TCP比UDP传输更可靠的原因。
8.什么是TCP拥塞控制?以及达到什么情况的时候开始减慢增长速度?
TCP拥塞控制是TCP协议用于管理网络拥塞的机制,旨在防止网络过载并确保公平的资源分配。其核心目标是通过动态调整发送速率,避免网络拥塞并维持高效的数据传输。
慢启动(Slow Start):
初始阶段,发送方以指数方式增加发送速率,每收到一个ACK,拥塞窗口(cwnd)增加1个MSS。
当cwnd达到慢启动阈值(ssthresh)时,进入拥塞避免阶段。
拥塞避免(Congestion Avoidance):
发送方以线性方式增加发送速率,每收到一个ACK,cwnd增加1/cwnd个MSS。
目标是逐步接近网络容量,避免突然引发拥塞。
快速重传(Fast Retransmit):
当发送方收到3个重复ACK时,立即重传丢失的报文段,而不必等待超时。
快速恢复(Fast Recovery):
在快速重传后,发送方将ssthresh设为当前cwnd的一半,并进入快速恢复阶段,cwnd逐渐增加。
减慢增长速度的情况
达到慢启动阈值(ssthresh):
当cwnd达到ssthresh时,发送方从慢启动切换到拥塞避免,发送速率的增长从指数变为线性。
检测到丢包:
当发生丢包(超时或收到3个重复ACK),发送方会减少发送速率。具体操作包括:
超时:将ssthresh设为当前cwnd的一半,cwnd重置为1个MSS,重新进入慢启动。
收到3个重复ACK:将ssthresh设为当前cwnd的一半,cwnd减半,进入快速恢复。
9.画出OSI和TCP/IP协议栈的对应关系
OS 参考模型共有7层,从下到上分别为:物理层、数据链路层、网络层、运输层、会话层、表示层应用层
TCP/IP 模型大体分为四层:网络接口层、网际层、运输层、应用层
两者的对应关系为:
物理层+数据链路层 =>网络接口层
网络层 =>网际层
运输层 =>运输层
会话层 + 表示层 + 应用层 => 应用层
10.TCP/IP数据链路层的交互过程是怎么样的?
网络层等在数据链路层用MAC地址作为通信目标,数据包到达网络层等往数据链路层发送的时候,首先回去ARP缓存表去查找ip对应的MAC地址,如果查到了,就将此ip对应的MAC地址封装到链路层数据包的包头。如果缓存中没有找到,则会发起一个广播,who is ip xxx tell ip xxxx,所有收到广播的机器看到这个ip是不是自己的,如果是自己的,则以单播的形式将自己的mac地址回复给请求机器。
11.传递到IP层怎么知道报文该给哪个应用程序,他怎么区分UDP报文还是TCP报文
根据端口继续区分需接受的程序;
根据ip协议头中标识字段:UDP17、TCP 6
12.请你来介绍一下UDP的connect函数
UDP 的 connect
函数是一个容易被误解的功能,因为 UDP 本身是无连接的协议。
1. 核心作用:绑定远程端点
无连接协议的特殊操作
UDP 的 connect
并不建立类似 TCP 的“连接”(无握手过程),而是将套接字与一个固定的远程地址和端口绑定。后续的数据收发可省略地址参数,并启用一些特性优化。
功能对比
操作 | 未 connect 的 UDP 套接字 |
已 connect 的 UDP 套接字 |
---|---|---|
发送数据 | 必须使用 sendto 指定目标地址 |
可直接使用 send /write |
接收数据 | 需用 recvfrom 获取来源地址 |
可用 recv /read ,但仅接收绑定地址的数据 |
错误反馈 | 异步错误(如 ICMP)可能被丢弃 | 异步错误会传递给应用层(如 ECONNREFUSED ) |
2. 核心机制
(1) 地址过滤
绑定后,套接字仅接收来自该远程地址的数据包,其他地址的数据会被内核丢弃。
示例:若绑定 192.168.1.100:8000
,则仅处理该源地址的数据,避免无关数据干扰。
(2) 错误检测
未连接时:UDP 发送的数据报若因网络问题(如目标不可达)失败,系统可能不会通知应用层。
连接后:若发送失败(如路由错误、端口未监听),系统会通过 send
/recv
返回错误(如 ECONNREFUSED
),提升可靠性。
(3) 性能优化
减少系统调用开销:sendto
每次需在用户态和内核态之间传递目标地址,而 connect
后使用 send
省去这一步骤。
内核路由缓存:绑定远程地址后,内核可缓存路由信息,加速后续数据包的发送。
3. 高级行为
(1) 多次调用 connect
UDP 套接字可多次调用 connect
,动态切换绑定的远程地址。
// 第一次绑定地址 A
connect(sockfd, &addr_A, sizeof(addr_A));
send(sockfd, buffer, len, 0); // 发送到 A
// 重新绑定地址 B
connect(sockfd, &addr_B, sizeof(addr_B));
send(sockfd, buffer, len, 0); // 发送到 B
解除绑定:通过 connect(sockfd, AF_UNSPEC)
可清除之前的绑定,恢复为未连接状态。
(2) 与 sendmsg
的兼容性
即使调用了 connect
,仍可使用 sendmsg
指定不同目标地址,临时覆盖绑定的地址。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <errno.h>
int main() {
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket() failed");
exit(EXIT_FAILURE);
}
struct sockaddr_in server_addr = {
.sin_family = AF_INET,
.sin_port = htons(8080),
.sin_addr.s_addr = inet_addr("192.168.1.100")
};
// 绑定远程地址
if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("connect() failed");
close(sockfd);
exit(EXIT_FAILURE);
}
// 发送数据(无需指定地址)
const char* msg = "Hello from connected UDP!";
ssize_t sent = send(sockfd, msg, strlen(msg), 0);
if (sent < 0) {
perror("send() failed");
close(sockfd);
exit(EXIT_FAILURE);
}
// 接收数据(仅接收绑定地址的回复)
char buffer[1024];
ssize_t received = recv(sockfd, buffer, sizeof(buffer), 0);
if (received < 0) {
if (errno == ECONNREFUSED) {
printf("目标地址拒绝连接!\n");
} else {
perror("recv() failed");
}
close(sockfd);
exit(EXIT_FAILURE);
}
printf("Received: %.*s\n", (int)received, buffer);
close(sockfd);
return 0;
}
13.请说说你对TCP连接中的time_wait状态的理解
CP连接中的TIME_WAIT
状态是一个非常重要的状态,它出现在主动关闭连接的一方。具体来说,当一方(通常是客户端)通过调用close()
或shutdown()
关闭连接时,它会进入TIME_WAIT
状态,持续一段时间(通常为2倍的最大报文段生存时间,即2MSL,MSL通常为2分钟)
在TIME_WAIT
状态下,虽然连接不再活跃,但是它仍会占用一定的系统资源(如端口)。这个状态会持续一段时间,之后连接才会彻底关闭,端口才能重新使用。
TIME_WAIT
状态是为了确保连接的完整关闭,并防止数据包重叠或丢失,尽管它可能在一些场景下导致端口资源的暂时浪费。
14.为什么要设置time_wait?
保证数据传输的完整性:当连接被关闭后,仍有可能有数据在网络中延迟传输。TIME_WAIT
状态确保即使数据包在连接关闭后仍然到达对方,它们也不会被误认为是新的连接的一部分。通过等待一定时间(2MSL),可以确保所有的数据包都被传输完毕,防止数据丢失。
避免端口号冲突:TCP连接在使用端口号时需要保证端口号的唯一性。如果在短时间内重新使用相同的端口号来建立新连接,可能会导致老的连接的数据包与新连接的数据包混淆。通过设置TIME_WAIT
状态,系统可以确保在该时间段内不会有新的连接使用这个端口,从而避免这种端口复用的冲突。
保证正确的连接关闭顺序:TCP协议采用四次挥手(Four-Way Handshake)来关闭连接。在关闭连接的过程中,TIME_WAIT
状态的存在确保双方在关闭连接时的序列号得到正确确认,避免双方对数据的最终确认出现问题。如果没有TIME_WAIT
状态,可能会出现序列号混乱,导致连接关闭后仍有数据被误处理。
确保可靠的连接重用:如果没有TIME_WAIT
状态,在短时间内,如果新的连接尝试使用相同的端口,可能会遇到延迟的、已关闭的连接数据包,从而引发错误的连接状态。TIME_WAIT
确保先前连接的数据完全消失后,新连接才能完全建立。
15.请你说一说TCP的模型,状态转移
16.什么是OSI七层模型和TCP/IP四层模型?每层列举2个协议。
TCP/IP模型更简化,通常分为4层,用于描述互联网中的通信。
网络接口层(Network Interface Layer):负责物理传输和链路层的功能。
协议:Ethernet、ARP(Address Resolution Protocol)
互联网层(Internet Layer):负责数据包的路由、寻址。
协议:IP、ICMP
传输层(Transport Layer):负责端到端的通信,保证数据的可靠传输。
协议:TCP、UDP
应用层(Application Layer):负责提供网络应用服务。
协议:HTTP、FTP
17.典型网络模型,简单说说有哪些?
OSI七层模型:描述了网络协议的分层结构,强调了不同协议如何协同工作。
TCP/IP模型:更加实际和简化,广泛用于互联网,重点是实际的网络通信。
Client-Server模型:一种常见的网络架构模式,客户端发起请求,服务器处理请求并返回响应。
Peer-to-Peer(P2P)模型:每个节点(设备)在网络中既是客户端也是服务器,数据直接传输,通常用于文件共享等应用。
分布式模型:多台计算机协作执行任务,通常使用消息传递或共享资源来处理复杂任务。
18.搜索baidu,会用到计算机网络中的什么层,每层是干嘛的?
当你使用浏览器搜索百度时,涉及以下几层的协议和功能:
应用层:
协议:HTTP(HyperText Transfer Protocol)
作用:浏览器向百度发送HTTP请求,获取网页内容。
传输层:
协议:TCP(Transmission Control Protocol)
作用:确保数据可靠传输,建立与百度服务器的TCP连接,保证数据的完整性。
网络层:
协议:IP(Internet Protocol)
作用:根据目标IP地址,将数据包路由到百度的服务器。
网络接口层:
协议:Ethernet、ARP(Address Resolution Protocol)
作用:负责通过本地网络接口传输数据包,确保数据到达本地网络的网关,发送到互联网上的正确位置。