池州市网站建设_网站建设公司_服务器部署_seo优化
2026/1/8 23:26:41 网站建设 项目流程

文章目录

  • 介绍一下TCP和UDP
    • TCP
    • UDP
  • 什么时候选择UDP,什么时候选择TCP?
  • TCP连接为什么要三次握手
  • TCP为什么挥手为什么要分为四步
  • 基于TCP和UDP常见协议
  • 使用UDP传输数据的系统一定不可靠吗?
  • TCP是如何保证可靠传输

介绍一下TCP和UDP

TCP

TCP(Transmission Control Protocol)传输控制协议,提供了一种面向连接可靠字节流服务。属于传输层协议。

特点:

  • 面向连接:通信前必须先建立连接(三次握手),通信结束要释放连接(四次挥手),双方在通信前要确认彼此的存在和状态。
  • 提供可靠传输:TCP 提供可靠、有序、不丢失、不重复的数据传输。
    • 不丢失:TCP使用确认应答(ACK)机制传输,发送方没收到接收方ACK会进行重传。
    • 数据不重复:TCP每个字节都有一个序号,接收方可以识别重复数据并丢弃。
    • 数据有序:即使网络中乱序到达,TCP 会按序号重新排序后再交付应用层
    • 数据无差错:使用校验和,出错的数据段会被丢弃并重传。
  • 面向字节流:TCP 把应用层数据看成连续的字节流,不保留应用层的“消息边界。
  • 全双工通信:通信双方可以同时发送和接收数据

TCP报文格式:

  • 序号: TCP传输过程,在发送端发出的字节流中,传输报文中的数据部分的每个字节都有它的编号。占32位,发送方发送数据都需要标记序号。TCP协议通过序号对上层提供有序的字节流.序号的语义与SYN控制标识有关,根据SYN是否为1,序号表达不同的含义:
    • SYN=1,当前为连接建立阶段,此时的序号为初始序号ISN(Initial Sequence Number),通过算法随机生成序号
    • SYN=0,数据传输开始,第一个报文的序号为ISN+1,后面的序号为前一个SN的值 + TCP报文的静载荷字节数。
  • 确认序号: 标识报文接收端期望接收的字节序列。如果设置了ACK控制位,确认序号的值表示一个准备接收的包的序列码。
  • 头部长度: 占四位,表示TCP报文首部的长度,单位4字节。
  • 保留字段:预留的字段长度为6位
  • 控制标志:
    • URG: 1位,表示紧急指针字段有效。,此标志用通知接收方,紧急数据需要优先处理。
    • ACK:1位,表示确认字段有效。确认接受到了之前发送的数据。
    • PSH: 提示接收端应立即处理并推送接收到的数据到应用层,而不必等待缓冲区填满。
    • RST: 重置连接,用于强制关闭连接或拒绝连接。当出现不正常通信情况。
    • SYN: 初始化连接,在TCP握手的第一个步骤发出,用于同步序列号。
    • FIN: 表示发送方已经发送完数据,并希望关闭连接。
  • 窗口大小:长度为16位。用来进行流量控制,流量控制单位为字节数,值是本端期望一次接收的字节数。
  • 校验和:16位,对整个TCP报文段,即TCP头部和TCP数据进行检验和计算,接收端用于对数据进行校验。
  • 紧急指针:16位,一个偏移量,和SN序号值相加表示紧急数据最后一个字节的序号。
  • 选项和填充: 在这部分可以增加可选项, 填充需要确保Tcp头是32位的整数倍,

UDP

User Datagram Protocol,用户数据报协议,基于IP协议提供面向无连接的网络通信服务。特点:简单不可靠面向数据报。 UDP协议属于ISO网络模型的传输层协议。

特点:

  • 无连接: 两台主机在使用UDP进行数据传输时,不需要建立连接,只需要知道对方端的IP和端口号即可把数据发送过去。
  • 不可靠:UDP协议没有确认重传机制,如果因为网络故障导致报文无法发到对方,或者对方接收到了报文,但是传输过程中乱序了,对方检验失败后把乱序的包丢了,UDP协议层也不给应用层任何错误反馈信息。
  • 面向数据报:以数据报文为单位一个个发出去,然后一个个接收的,导致上面的应用层无法灵活控制数据的读写次数和数量。

UDP报文格式:

  • 源端口号: 发送方的端口,用于唯一确认发送方主机的一个进程。 大小范围1-65535
  • 目的端口: 接收方的端口,用于唯一确认接收方主机的一个进程。大小范围1-65535
  • UDP长度:一个UDP报文所能传输的最大长度是64K,包含UDP首部。
  • UDP校验和: 为了确保数据包在传送过程中,数据检测数据是否被篡改和丢失的一种手段。通过二进制补码求和进行校验,校验和的内容包括:
    • 伪首部(IP数据包的一部分):源IP地址(32位),目的IP地址(32位),保留字段(8位, 0),协议号(8位, 指定为17,代表udp)UDP长度(16) UDP数据报的总长度,包括头部和数据
    • UDP首部:源端口号、目的端口号、长度字段、校验和字段(初始值为0)
    • UDP数据: 实际传输的应用层数据。

什么时候选择UDP,什么时候选择TCP?

主要从三个方面出发考虑:

  1. 适用场景:
    • TCP: 适用于需要可靠传输和有序数据流的应用场景。Web浏览、电子邮件、文件传输等需要可靠的数据传输,这些通常使用TCP协议。TCP通过确认和重传机制保证数据的可靠性,并且通过流量控制和拥塞控制适应网络状况,确保数据的有序传输。
    • UDP:UDP则适用于对实时性要求较高,且对数据顺序和完整性要求不那么严格的应用场景。例如,音频和视频流媒体、网络游戏等需要快速传输和实时交互,通常使用UDP协议。
  2. 传输速度:在传输速度方面,UDP通常比TCP更快。这是因为TCP协议为了保证数据的可靠传输,采用了确认机制、重传机制、流量控制和拥塞控制等机制,这些操作增加了处理时间和系统资源的消耗,导致传输速度相对较慢。而UDP则没有这些机制,可以更快地发送数据。
  3. 安全性:
    • TCP:TCP的安全性相对较高,因为它采用了确认机制、重传机制、流量控制和拥塞控制等机制,可以减少数据传输中的错误和攻击。此外,TCP的连接是面向连接的,需要在传输数据之前建立连接,这有助于防止未经授权的访问和数据泄漏。
    • UDP:UDP是无连接协议,可以直接发送数据,无需建立连接和断开连接等操作,因此速度较快,但这也增加了被攻击的风险

TCP连接为什么要三次握手

三次握手的目的:让双方能够同步各自的序列号和确认号,确保双向通信的可靠性。同时确保通信双方的发送能力和接受能力都正常。

先介绍一个TCP连接三次握手过程:

步骤解释:

  • 第一次握手:SYN
    • 客户端主动向服务端发送一个SYN请求,主动建立TCP连接,包中设置seq为a
  • 第二次握手:SYN-ACK
    • 服务端准许建立这个连接的情况下,向客户端返回一个SYN-ACK(同步-确认)包.
    • 返回包包含两个信息: ack=a+1,表示确认收到客户端seq为a的包。seq=b表示自己的初始序列号为b
  • 第三次握手: ACK
    • 客户端在接收端到服务端的SYN-ACK响应之后,发送一个 ACK(确认)包给服务器。
    • 这个包确认号为 ack = b + 1,表示已接收到服务器的 SYN 包。

三次握手各步骤作用:

  • 确保双方的可用性: 第一次握手(SYN)让服务端知道客户端主动想建立TCP连接,第二次(SYN-ACK)让客户端确认服务器的存在。
  • 序列号同步: 第一次握手和第二次握手过程中交换了双方在进行数据传输时的起始序列号。可以确保后续传递数据包的排序正确性。
  • 避免半开放连接:如果不进行第三次握手,可能导致连接客户端或者服务端认为连接已经建立,但另一方断开了。这种情况会导致存在潜在的半开放连接,导致资源浪费。

为什么不能两次握手?

服务器无法确认客户端的接收能力是否正常。如果服务器发的SYN+ACK客户端根本没收到,服务器却认为连接已经建立,客户端认为没建立成功.双方状态不一致,服务器资源会被浪费。

TCP为什么挥手为什么要分为四步

挥手的目的:确保在数据完整传输前提下,安全的断开连接。

先介绍一下四次挥手的步骤:

各步骤解释:

  • 第一次挥手:FIN
    • 主动断开方主动发送方发送一个FIN包,表示它已经没有数据要发送了,想要关闭连接。
    • 发送完FIN包之后,主动段开放进行FIN_WAITE_1状态。
  • 第二次挥手: ACK
    • 被动断开方收到FIN包之后,发送一个ACK包,表示确认收到关闭请求。
    • 发送完ACK包之后,被动断开方进入CLOSE_WAIT的状态。
  • 第三次挥手: FIN
    • 被动断开方在处理所有未完成的数据传输之后,会主动发送一个FIN包,表示自己已经准备好关闭连接请求了。
    • 被动断开方会进入LAST_ACK状态,等待客户端的ACK请求。
  • 第四次挥手: ACK
    • 主动断开方在接受到 对方法来的FIN包时,会立即发送一个ACK包,确保让对方知道已经接受到对方的关闭请求。
    • 发送ACK之后,主动断开方进入TIME_WAIT状态,等待一段时间以确保对方已经ACK,之后完全关闭连接。等待时间一般为2 * MSL(最大报文段存活时间),确保被动断开方能够收到ACK包(没有收到ACK包,被动断开方会重发FIN请求, 在2*MSL时间范围内)。

四个步骤的本质:

  • 第一步:客户端不再发送。
  • 第二步:服务器反馈知道客户端不发了
  • 第三步:服务器不再发送
  • 第四步:客户端知道服务器不发了

为什么需要四步挥手?

从上面步骤总结来看:TCP 采用四次挥手断开连接,是因为 TCP 是全双工通信协议,连接的两个方向需要分别关闭。任意一方在发送完数据后只能关闭自己的发送方向,对方可能仍有数据需要发送,因此需要分别发送 FIN 和 ACK 确认,最终完成连接的可靠释放。

基于TCP和UDP常见协议

这类问题询问形式,一般是xx协议基于什么TCP/UDP,这里直接做个总结

常见基于TCP的协议(协议用途):

  • HTTP/HTTPS:web服务
  • FTP:文件传输
  • SMTP:发送邮件
  • POP3:接受邮件
  • SSH:安全远程登录
  • Telnet:远程登录

常见基于UDP的协议(协议用途):

  • DNS:域名解析
  • DHCP:动态分配IP
  • TFTP:简单文件传输
  • NTP:网络时间同步
  • QUIC:基于 UDP 实现可靠传输,HTTP/3 使用。

使用UDP传输数据的系统一定不可靠吗?

结论:使用 UDP 传输的数据本身是不可靠的,但基于 UDP 构建的系统可以是可靠的,系统的可靠性可以放在应用层实现。

常见基于UDP可靠的例子:

  • QUIC/HTTP3:
    • 基于UDP
    • 同时可提供:可靠传输有序交付,拥塞控制,内建加密
  • DNS:失败之后自动会进行尝试。
  • 实时音视频:RTC/WebRTC协议,可以保证关键帧不丢失。

TCP是如何保证可靠传输

TCP 通过序号、确认应答、重传机制、校验和、滑动窗口、流量控制和拥塞控制等机制,保证数据可靠、有序、无差错地传输。

  1. 保证数据不丢失
    • 确认应答机制:每个 TCP 报文段都需要接收方确认
    • 超时重传:发送方在超时时间内没收到 ACK。认为数据丢失,自动重传。
    • 快重传:连续收到3 个重复 ACK,不等超时,立刻重传丢失段。
  2. 保证数据不重复、不乱序
    • TCP 给每个字节编号
    • 接收方:可以通过序号对数据进行去重和重排序。
  3. 保证数据无差错传输:
    • 校验和:发送前计算校验和,接收后校验,出错的报文段直接丢弃。
  4. 保证通信双方和中间传输网络不被压垮:
    • 拥塞控制可协调数据发送速率,具体包括
      • 慢启动
      • 拥塞控制
      • 快重传
      • 快恢复
  5. 保证可靠连接建立和释放
    • 通过三次握手可保证可靠连接建立。
    • 通过四次挥手可保证连接安全释放。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询