OSI七层模型&TCP/IP四层&面试高频考点

OSI七层模型&TCP/IP四层&面试高频考点

1 OSI七层模型

1. 物理层:透明地传输比特流

在物理媒介上传输原始比特流,定义了连接主机的硬件设备和传输媒介的规范。它确保比特流能够在网络中准确地传输,例如通过以太网、光纤和无线电波等媒介。

  • 通过光纤等媒介传输原始比特流

2. 数据链路层:帧编码、误差纠正控制

提供点对点的数据传输服务,负责将原始比特流转换为数据帧,并检测和纠正传输中出现的错误。它还控制访问物理媒介的方式,以及数据帧的传输和接收。

  • 将原始比特流转换为数据帧

3. 网络层:路由、寻址(决定数据在网络的游走路径)

负责数据包的路由和转发,以及网络中的寻址和拥塞控制。它选择最佳的路径来传输数据包,以确保它们能够从源主机到目标主机进行传输。

  • 数据包的路由和转发

4. 传输层:两台主机进程之间通信提供通用的数据传输服务,TCP、UDP

为应用程序提供端到端的数据传输服务,负责数据的分段、传输控制、错误恢复和流量控制。它主要使用 TCP(传输控制协议)和 UDP(用户数据报协议)来实现这些功能。

  • 通过TCP、UDP实现端到端的数据传输

常见协议:

  1. TCP(Transmission Control Protocol):提供可靠的、面向连接的数据传输服务,确保数据的可靠性、顺序性和完整性。TCP适用于对数据传输质量要求较高的场景,如文件传输、网页浏览等
  2. UDP(User Datagram Protocol):提供无连接的数据传输服务,不保证数据的可靠性,也不保证数据的顺序性和完整性。UDP适用于实时性要求较高、对数据传输质量要求不那么严格的场景,如音视频传输、在线游戏等。

5. 会话层:管理(建立、维护、重连)应用程序之间的会话

管理应用程序之间的通信会话,负责建立、维护和终止会话。它还提供了数据的同步和检查点恢复功能,以确保通信的完整性和持续性。

6. 表示层:数据处理(编解码、加解密、压缩解压缩)

负责数据的格式化、加密和压缩,以确保数据在不同系统之间的交换是有效的和安全的。它还提供了数据格式转换和语法转换的功能

  • 数据编辑码、加解密、压缩解压缩

7. 应用层:为计算机提供服务(email、文件传输等)

提供用户接口和应用程序之间的通信服务。在这一层,用户可以访问各种网络应用程序,如电子邮件、文件传输和远程登录

  • 应用层常见协议:
  1. HTTP(HyperText Transfer Protocol):用于在客户端和服务器之间传输超文本数据,通常用于 Web 浏览器和 Web 服务器之间的通信。
  2. FTP(File Transfer Protocol):用于在客户端和服务器之间传输文件,支持上传和下载文件的功能。
  3. SMTP(Simple Mail Transfer Protocol):用于在邮件服务器之间传输电子邮件,负责发送邮件。
  4. POP3(Post Office Protocol version 3):用于从邮件服务器上下载邮件到本地计算机,负责接收邮件。
  5. IMAP(Internet Message Access Protocol):也是用于接收邮件的协议,与 POP3 类似,但提供了更丰富的功能,如在服务器上管理邮件等。
  6. DNS(Domain Name System):用于将域名解析为对应的 IP 地址,从而实现域名和 IP 地址之间的映射。
  7. HTTPS(HyperText Transfer Protocol Secure):是 HTTP 的安全版本,通过 SSL/TLS 加密传输数据,保证通信过程中的安全性。
  8. SSH(Secure Shell):用于远程登录和执行命令,提供了加密的网络连接,保证了通信的安全性。
  9. SNMP(Simple Network Management Protocol):用于网络设备之间的管理和监控,可以实现对网络设备的远程配置和监控。
  10. Telnet:用于远程登录和执行命令,类似于 SSH,但不提供加密功能,通信数据不安全。

2 TCP/IP四层模型

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议

1. 网络接口层(数据链路层)【物理+数据链路层,传输比特流+将比特流转换为数据帧】

网络接口层 Link Layer:OSI中的物理层+数据链路层,负责管理网络硬件设备和物理媒介之间的通信。它包括以太网、Wi-Fi、蓝牙等各种物理层和数据链路层协议。

  • 通过光纤等透明传送比特流+将原始比特流转换为数据帧
    常见协议:
  1. 以太网协议(Ethernet):是一种常见的局域网技术,使用MAC地址进行帧的传输和接收。
  2. 无线局域网协议(Wi-Fi):用于无线局域网的数据传输,通常基于IEEE 802.11标准。
  3. 点对点协议(P2P):用于建立点对点连接的协议,通常用于拨号连接和虚拟专用网(VPN)等场景。
  4. 数据链路层交换协议(DLC):用于在数据链路层进行数据交换和管理的协议,如HDLC、SLIP和PPP等。

2. 网络层(数据包在网络的路由和寻址)

网络层(Internet Layer):相当于 OSI 模型中的网络层,负责数据包的路由和转发。它使用 IP(Internet Protocol)协议来定义数据包的传输路径,并处理不同网络之间的通信。

  • 路由和寻址,决定数据包在网络的游走路径
    常见协议:
  1. IP(Internet Protocol):是互联网中最基本的协议,用于在网络中传输数据包。IP协议定义了数据包的格式、寻址方式和路由选择等信息,是整个互联网的基础。
  2. ICMP(Internet Control Message Protocol):用于在IP网络中传递控制消息和错误信息。ICMP通常用于网络设备之间的通信,如路由器和主机之间的通信,以及用于检测网络连通性和故障诊断。
  3. ARP(Address Resolution Protocol):用于将IP地址映射为MAC地址(物理地址)。ARP协议在局域网内部使用,通过发送ARP请求获取目标设备的MAC地址,从而实现数据包的传输。
  4. RARP(Reverse Address Resolution Protocol):与ARP相反,用于将MAC地址映射为IP地址。RARP协议通常用于无盘工作站等设备,可以根据MAC地址获取对应的IP地址。
  5. IPv6(Internet Protocol version 6):是IP协议的下一代版本,用于解决IPv4地址空间不足的问题。IPv6采用128位地址长度,提供了更大的地址空间,支持更多的设备连接到互联网。

3. 传输层(通过TCP、UDP让两台主机间的进程互相通信,传输数据)

传输层(Transport Layer):与 OSI 模型中的传输层相对应,提供端到端的数据传输服务。在 TCP/IP 模型中,主要有两个协议:TCP(传输控制协议)和 UDP(用户数据报协议),用于确保可靠的数据传输和简单的数据传输。

  • 通过TCP可靠慢速、UDP不可靠高速实现两台主机进程之间通信,传输数据
    常见协议:
  1. TCP(Transmission Control Protocol):提供可靠的、面向连接的数据传输服务,确保数据的可靠性、顺序性和完整性。TCP适用于对数据传输质量要求较高的场景,如文件传输、网页浏览等。
  2. UDP(User Datagram Protocol):提供无连接的数据传输服务,不保证数据的可靠性,也不保证数据的顺序性和完整性。UDP适用于实时性要求较高、对数据传输质量要求不那么严格的场景,如音视频传输、在线游戏等。

4. 应用层【会话+表示+应用层】

应用层(Application Layer):OSI 模型中的会话层+表示层+应用层,负责处理用户与网络应用程序之间的通信。它包括诸如 HTTP、FTP、SMTP 等协议,用于实现不同类型的网络服务和应用。

  • 管理(建立、维护、重连)应用程序间的会话=》会话层
  • 数据处理(编解码、加解密、压缩解压缩)=》表示层
  • 为用户提供邮件服务、远程登录服务等 =》应用层
    常见协议:
  1. HTTP(HyperText Transfer Protocol):用于在客户端和服务器之间传输超文本数据,通常用于 Web 浏览器和 Web 服务器之间的通信。
  2. FTP(File Transfer Protocol):用于在客户端和服务器之间传输文件,支持上传和下载文件的功能。
  3. SMTP(Simple Mail Transfer Protocol):用于在邮件服务器之间传输电子邮件,负责发送邮件。
  4. POP3(Post Office Protocol version 3):用于从邮件服务器上下载邮件到本地计算机,负责接收邮件。
  5. IMAP(Internet Message Access Protocol):也是用于接收邮件的协议,与 POP3 类似,但提供了更丰富的功能,如在服务器上管理邮件等。
  6. DNS(Domain Name System):用于将域名解析为对应的 IP 地址,从而实现域名和 IP 地址之间的映射。
  7. HTTPS(HyperText Transfer Protocol Secure):是 HTTP 的安全版本,通过 SSL/TLS 加密传输数据,保证通信过程中的安全性。
  8. SSH(Secure Shell):用于远程登录和执行命令,提供了加密的网络连接,保证了通信的安全性。
  9. SNMP(Simple Network Management Protocol):用于网络设备之间的管理和监控,可以实现对网络设备的远程配置和监控。
  10. Telnet:用于远程登录和执行命令,类似于 SSH,但不提供加密功能,通信数据不安全。

面试高频考点【TCP/IP四层】

1. 什么是TCP/IP网络分层,分层有什么好处

TCP/IP模型是一个四层模型,包括应用层、传输层、网络层和网络接口层(数据链路层)。

  • 网络接口层则负责数据链路的具体操作。
  • 网络层负责数据包的路由,如IP协议;
  • 传输层负责端到端的数据传输,如TCP和UDP;
  • 应用层负责处理特定应用程序的数据,如HTTP、FTP等;
  1. 各层独⽴:限制了依赖关系的范围,各层之间使⽤标准化的接⼝,各层不需要知道上下层是如何⼯作的,增加或者修改⼀个应⽤层协议不会影响传输层协议
  2. 灵活性更好:⽐如路由器不需要应⽤层和传输层,分层以后路由器就可以只⽤加载更少的⼏个协议层
  3. 易于测试和维护:提⾼了可测试性,可以独⽴的测试特定层,某⼀层有了更好的实现可以整体替换掉
  4. 能促进标准化:每⼀层职责清楚,⽅便进⾏标准化

2. TCP的三次握⼿中为什么是三次?为什么不是两次、四次?

两次不够可靠。

  • 如果只有两次握手,服务器无法确认客户端是否真的收到了它的确认响应,这样服务器可能会误以为连接已经建立,而实际上客户端可能没有收到服务器的响应,导致服务器空等资源浪费。

四次也可以,但是没必要,"投资比不高,效益不高"。

  • 三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数

3. TCP的四次挥⼿为什么是四次?为什么不能是三次?[还有最后一波数据要传]

  1. 关闭请求:当一方(比如客户端)想要断开连接时,它会发送一个FIN(Finish)标志,告诉对方它不再发送数据了。
  2. 确认收到关闭请求:另一方(服务器)接收到FIN后,会回复一个ACK,确认收到了关闭请求,但此时服务器可能还有数据需要发送给客户端,所以连接并未立即关闭。
  3. 服务器也准备关闭:当服务器准备好关闭连接时,它也会发送一个FIN给客户端,表明自己也没有数据要发送了。
  4. 客户端确认关闭:客户端收到服务器的FIN后,发送最后一个ACK,确认收到了服务器的关闭请求,这时等待一段时间(确保所有数据包都已到达),连接正式关闭。
  • 为什么不能是三次挥手? 主要是由于全双工通信的特性,即连接双方都可以同时发送和接收数据。在断开连接时,必须确保双方都没有数据要发送了。两次挥手(客户端发送FIN,服务器发送FIN+ACK,客户端ACK)不能解决这个问题,因为服务器在第一步的ACK中无法同时表达自己是否还有数据要发送。因此,需要额外的步骤来确保两边都完成了数据发送并且同意关闭连接,这就是为什么需要四次挥手。

4. 为什么 SYN/FIN 不包含数据却要消耗⼀个序列号?

维护TCP连接的可靠性和有序性,确保连接的建立与终止过程能够被准确无误地管理。凡是需要对端确认的,⼀定消耗TCP报⽂的序列号。SYN 和FIN需要对端的确认,所以需要消耗⼀个序列号

  • 在三次握手过程中,SYN段标志着客户端或服务器希望建立连接的意愿。这个序列号初始化了该连接的传输序列,为后续的数据传输打下基础。它需要被确认,以确保连接请求被对方正确接收,因此消耗一个序列号确保了这个控制信息能够被可靠地处理和确认。

5. 什么是半连接队列?什么是SYN Flood攻击?[伪造IP+SYN]

客户端⼤量伪造 IP 发送 SYN 包,服务端回复的 ACK+SYN 去到了⼀个「未知」的 IP 地址,势必会造成服务端⼤量的连接处于 SYN_RCVD 状态,⽽服务器的半连接队列⼤⼩也是有限的,如果半连接队列满,也会出现⽆法处理正常请求的情况。

6. 说说TCP快速打开(TFO)的原理【SYN包就带数据】

TFO 是在原来 TCP 协议上的扩展协议,它的主要原理就在发送第⼀个 SYN 包的时候就开始传数据了,不过它要求当前客户端之前已经完成过「正常」的三次握⼿。

  • 快速打开分两个阶段:请求 Fast Open Cookie 和 真正开始 TCP Fast Open
  1. Fast Open Cookie
  2. TCP Fast Open
  • 好处:⼀个最显著的优点是可以利⽤握⼿去除⼀个往返 RTT
    可以防⽌ SYN-Flood 攻击之类的
    普通TCP/IP连接与TFO(TCP Fast Open)对比:

7. TCP报⽂中的时间戳有什么作⽤?[解决RTT、防止序列号回绕]

  1. 解决计算往返时延 RTT(Round-Trip Time)
  • 在启⽤ Timestamps 选项以后,因为 ACK 包⾥包含了 TSval 和 TSecr,这样⽆论是正常确认包,还是重传确认包,都可以通过这两个值计算出 RTT。
  1. 防⽌序列号的回绕问题(知道哪个包是什么时候发的,)
  • TCP 的序列号⽤ 32bit 来表示,因此在 2^32 字节的数据传输后序列号就会溢出回绕。TCP 的窗⼝经过窗⼝缩放可以最⾼到 1GB(2^30),在⾼速⽹络中,序列号在很短的时间内就会被重复使⽤。

    假设发送了 6 个数据包,每个数据包的⼤⼩为 1GB,第 5 个包序列号发⽣回绕。
    第 2 个包因为某些原因延迟导致重传,但没有丢失到时间 t7 才到达。
    这个迷途数据包与后⾯要发送的第 6 个包序列号完全相同,如果没有⼀些措施进⾏区分,将会造成数据的紊乱。
    有 Timestamps 的存在,迷途数据包与第 6 个包可以区分

8. TCP 的超时重传时间是如何计算的?【平滑因子】

TCP 具有超时重传机制,即间隔⼀段时间没有等到数据包的回复时,重传这个数据包。

这个重传间隔也叫做超时重传时间(Retransmission TimeOut, 简称RTO)

经典算法:往返时延 RTT(Round-Trip Time)

  • ⼀个最简单的想法就是取平均值,⽐如第⼀次 RTT 为 500ms,第⼆次 RTT 为 800ms,那么第三次发送时,各让⼀步取平均值 RTO 为 650ms。
    经典算法引⼊了「平滑往返时间」(Smoothed round trip time,SRTT):经过平滑后的RTT的值,每测量⼀次 RTT 就对 SRTT 作⼀次更新计算。

9. 能不能说⼀说 TCP 的流量控制?【滑动窗口】

对于发送端和接收端⽽⾔,TCP 需要把发送的数据放到发送缓存区, 将接收的数据放到接收缓存区。

  • ⽽流量控制要做的事情,就是在通过接收缓存区的⼤⼩,控制发送端的发送。如果对⽅的接收缓存区满了,就不能再继续发送了。
  • 为了控制发送端的速率,接收端会告知客户端⾃⼰接收窗⼝(rwnd),也就是接收缓冲区中空闲的部分
  1. 首先双方三次握手,初始化各自的窗口大小,如双方均为 400 个字节。假如当前发送方给接收方发送了 200 个字节,那么,发送方的SND.NXT(下一个发送位置)会右移 200 个字节,也就是说当前的可用窗口减少了 200 个字节。
  2. 接受方收到后,放到缓冲队列里面,窗口大小REV.WND =400-200=200 字节,所以 win=200 字节返回给发送方。接收方会在 ACK 的报文首部带上缩小后的滑动窗口 200 字节
  3. 发送方又发送 200 字节过来,200 字节到达,继续放到缓冲队列。不过这时候,由于大量负载的原因,接受方处理不了这么多字节,只能处理 100 字节,剩余的 100 字节继续放到缓冲队列。这时候,REV.WND = 400-200-100=100 字节,即 win=100 返回发送方。
  4. 发送方继续发送 100 字节过来,这时候,接收窗口 win 变为 0。
  5. 发送方停止发送,开启一个定时任务,每隔一段时间,就去询问接受方,直到 win 大于 0,才继续开始发送。

注:窗口单位大小一般是MSS的整数倍。

滑动窗口:

  • 初始化窗口:一开始,发送方会获知接收方的窗口大小,这个大小代表了接收方当前能接受的数据量。比如,如果窗口大小是1000个字节,发送方就知道最多可以连续发送1000个字节的数据,而不会造成接收方处理不过来。
  • 发送数据:发送方开始发送数据,每发送一个数据包(或一部分数据),它就会从自己的"待发送窗口"中移除相应数量的字节,这个窗口就像是可以左右滑动的门框,随着数据的发送而向前移动。
  • 接收确认:接收方接收到数据后,会发送一个ACK(Acknowledgment)确认报文,告诉发送方收到了哪些数据,并且更新自己还能接收多少数据(即新的窗口大小)。如果接收方处理数据的速度赶不上接收速度,它会减小窗口大小来减缓发送方的发送速率。
  • 窗口调整:发送方根据接收方的ACK报文中的窗口大小信息,动态调整自己的发送窗口大小。如果接收方处理了一些数据,窗口大小变大,发送方就可以发送更多的数据;反之,如果接收方的缓冲区快满了,窗口大小缩小,发送方就需要减慢发送速度。
  • 滑动:这个过程中,"滑动"的概念体现在发送窗口随着数据的发送和接收确认而向前滑动,同时也可能根据接收方的处理能力向后收缩或扩展,形象地模拟了数据传输的动态过程。

10. 如何理解 TCP 的keep-alive的原理?

⼀个 TCP 连接上,如果通信双⽅都不向对⽅发送数据,那么 TCP 连接就不会有任何数据交换。

  • 假设应⽤程序是⼀个 web 服务器,客户端发出三次握⼿以后故障宕机或被踢掉⽹线,对于 web 服务器⽽已,下⼀个数据包将永远⽆法到来,但是它⼀⽆所知。
  • TCP 协议的设计者考虑到了这种检测⻓时间死连接的需求,于是乎设计了 keepalive 机制。它的作⽤就是探测对端的连接有没有失效,通过定时发送探测包来探测连接的对端是否存活。不过默认情况下需要 7200s 没有数据包交互才会发送 keepalive 探测包,往往这个时间太久了,我们熟知的很多组件都没有开启 keepalive 特性,⽽是选择在应⽤层做⼼跳机制。

11. 聊⼀聊TCP中的端⼝号(端口号与网络分层)

TCP ⽤两字节的整数来表示端⼝,⼀台主机最⼤允许 65536 个端⼝号。

  • 熟知端⼝号:范围0~1023
    HTTP:80
    HTTPS:443
    SSH:22
  • 已登记的端⼝号:范围1024~49151
    MySQL:3306
    Redis:6379
    MongoDB:27017
  • 临时端⼝号:范围49152~65535

12. TCP场景题1:报文返回的确认号判断

A B 两个主机之间建⽴了⼀个 TCP 连接,A 主机发给 B 主机两个 TCP 报⽂,⼤⼩分别是 500 和 300,第⼀个报⽂的序列号是 200,那么 B 主机接收两个报⽂后,返回的确认号是多少?

  1. 第一个报文处理:A发送的第一个报文序列号是200,含有500字节数据,因此该报文的序列号范围是200到699(200 + 499)。
  2. B收到后,应确认收到的所有数据,所以确认号应该是下一个期待的序列号,即700。
  3. 第二个报文处理:紧接着,A发送的第二个报文序列号紧接着上一个报文,由于第一个报文是500字节,故第二个报文的序列号从700开始(实际上,TCP报文的序列号是连续的,但这里为了说明方便,我们直接按数据累加理解)。这个报文有300字节数据,因此序列号范围是700到999(700 + 299)。
  4. B主机在接收到这两个报文后,会合并确认,即确认收到第一个和第二个报文的所有数据。因此,B主机返回的确认号应当是第二个报文的数据结束后的下一个序列号,即1000。
  5. 结论:B主机返回的确认号是1000。

答:500+300+200

13. TCP场景题2:收到 IP 数据包解析以后,它怎么知道这个分组应该投递到上层的哪⼀个协议(UDP 或 TCP)?

协议: 区分IP协议上的上层协议。在Linux系统的/etc/protocols⽂件中定义了所有上层协议对应的协议字段,ICMP为1,TCP为6,UDP为17

14. TCP场景题3:TCP 提供了⼀种字节流服务,⽽收发双⽅都不保持记录的边界,应⽤程序应该如何提供他们⾃⼰的记录标识呢?

应⽤程序使⽤⾃⼰约定的规则来表示消息的边界,⽐如有⼀些使⽤回⻋+换⾏("\r\n"),⽐如 Redis的通信协议(RESP protocol)

  1. 定长消息:如果应用层的数据记录长度固定,接收端可以每次读取固定大小的数据块,以此来区分不同的记录。
  2. 前缀/长度字段:在每个数据记录前添加一个字段来表示该记录的长度或接下来数据的字节数。接收端先读取长度信息,然后根据该长度读取对应数量的字节作为一条完整记录。
  3. 特殊分隔符:在数据记录间使用特定的分隔符(如换行符\n),接收端通过查找这些分隔符来分割出不同的记录。需要注意的是,如果数据内容中也可能包含分隔符,则需采用转义机制避免混淆。
  4. 结束标记:在数据流的末尾添加一个特殊的结束标记,接收端识别到此标记即认为一个完整的消息结束。这种方式适用于一次性发送整个数据块的场景。
  5. 协议封装:设计应用层协议时,可以在协议头部包含额外的信息字段,比如记录计数或者记录ID,帮助接收端理解和重组数据。
  6. 消息帧:将每个记录封装成带有头部和数据部分的帧结构,头部中包含帧的长度或其他控制信息,接收端解析头部后,按指定长度读取数据部分。

15. telnet的用法:检查端口是否打开、发送http请求

  1. 检查端口是否打开
    telnet 的⼀个最⼤作⽤就是检查⼀个端⼝是否处于打开,使⽤的命令是 telnet [domainname or ip] [port],这条命令能告诉我们到远端 server 指定端⼝的⽹连接是否可达
  2. 发送http请求

16. tcpdump的用法:分析网络流量,抓tcp包

tcpdump 则是⼀个命令⾏的⽹络流量分析⼯具,功能⾮常强⼤,⼀般我们⽤来抓TCP的包

bash 复制代码
sudo apt-get install tcpdump
#执行命令开始抓包,ctrl+C,停止抓包
tcpdump
# 指定抓取2个数据包
tcpdump -c 2
# 将抓包数据写入指定文件
tcpdump -c 10 -w tcpdump_test.log
# 打印出所有可用的网卡
tcpdump -D
# 监控指定eth0网卡
tcpdump -i eth0
# 抓包时显示时间
tcpdump -tttt
# 抓取指定协议
tcpdump udp
tcpdump icmp 
tcpdump tcp
tcpdump arp

# 过滤源、目标
tcpdump src port 8080
tcpdump dst port 80

# 抓取指定ip、指定端口数据
tcpdump tcp and src 192.168.1.112 and port 8080

tcpdump截取包默认显示数据包的头部。

  • 普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。
  • 基础格式:时间 数据包类型 源IP 端口/协议 > 目标IP 端口/协议 协议详细信息

17. TCP、UDP区别

  1. TCP是⼀个⾯向连接的、可靠的(三次握手)、基于字节流的传输层协议。UDP(没有相应建立连接过程)是⼀个⾯向⽆连接的传输层协议。
  2. TCP有状态:TCP 会精准记录哪些数据发送了,哪些数据被对⽅接收了,哪些没有被接收到,⽽且保证数据包按序到达,不允许半点差错。
  3. TCP可控制:意识到丢包了或者⽹络环境不佳,TCP 会根据具体情况调整⾃⼰的⾏为,控制⾃⼰的发送速度或者重发。
  4. TCP更可靠,常用于对数据完整性要求严格:文件传输、电子邮件等。UDP常用于对速度要求更高,对数据完整性要求较低的场景,如音视频传输、在线游戏等。

18. 如要要你来设计QQ,在网络协议上你会如何考虑

登陆采⽤TCP协议和HTTP协议,你和好友之间发送消息,主要采⽤UDP协议,内⽹传⽂件采⽤了P2P技术。

总来的说:

  1. 登陆过程,客户端client 采⽤TCP协议向服务器server发送信息,HTTP协议下载信息。登陆之后,会有⼀个TCP连接来保持在线状态。
  2. 和好友发消息,客户端client采⽤UDP协议,但是需要通过服务器转发。腾讯为了确保传输消息的可靠,采⽤上层协议来保证可靠传输。如果消息发送失败,客户端会提示消息发送失败,并可重新发送。
  3. 如果是在内⽹⾥⾯的两个客户端传⽂件,QQ采⽤的是P2P技术,不需要服务器中转。

参考文章:

https://blog.csdn.net/wwy0324/article/details/109310658

https://blog.csdn.net/weixin_44772566/article/details/136717134

相关推荐
野老杂谈1 小时前
【面试系列】TypeScript高频面试题及详细解答
前端·面试·typescript·编程语言
Do1 小时前
同学你写的可能不是单例...
javascript·设计模式·面试
苏十八1 小时前
前端基础:CSS(篇一)
开发语言·前端·css·考研·面试·tensorflow·学习方法
绯雨9342 小时前
两数之和你会,三数之和你也会吗?o_O
前端·javascript·算法·面试
B.D.S.2 小时前
计网之IP
网络·tcp/ip·智能路由器
默默且听风2 小时前
golang面试题《基础知识》篇
后端·面试·go
weixin_449295775 小时前
Host Static Assets in CDN(在CDN中托管静态资源)
面试
Dignity_呱5 小时前
🤡官:你有遇到很难排查的问题吗
前端·vue.js·面试
听楷哥说跨境5 小时前
如何使用代理 IP 防止多个 Facebook 帐户关联 - 最佳实践
网络·tcp/ip·安全·ip
野老杂谈5 小时前
【面试系列】Kotlin 高频面试题及详细解答
面试·职场和发展·kotlin·编程语言