Skip to main content

TCP 协议 & UDP 协议

OSI 七层模型TCP/IP 五层模型TCP/IP 四层模型对应 UDP对应 TCP/IP 协议族的协议
应用层应用层应用层数据HTTP、TFTP、FTP、NFS、WAIS、SMTP
表示层Telnet、Rlogin、SNMP、Gopher
会话层SMTP、DNS
传输层传输层传输层TCP、UDP
网络层网络层网络层IP、ICMP、IGMP
数据链路层数据链路层网络接口层ARP、RARP、Ethernet、PPP
物理层物理层数据比特流IEEE 802.1A、IEEE 802.2 ~ IEEE 802.11

从前面网络的模型中可以看到位于传输层的 TCP 与 UDP 协议,他们是整个计算机网络体系的核心,因为他们位于主机协议栈的最底层,向上方应用层提供不同的数据交付方式。

一、协议

计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议(protocol)。

1、面向连接的协议与无连接的协议

如果采用面向连接的协议进行通信,想通信的一方就首先要和另一方的应用程字建立连接,就像打电话,只有当连接建立之后,才能进行通信。位于传输层的 TCP 就是面向连接协议的一个例子。

无连接的协议在通信之前不用建立连接,就像寄信,只要有对方地址,就会正确地到达目的地。网络层的 IP 和传输层的 UDP 都是无连接协议。

2、可靠的协议与不可靠的协议

可靠的协议保证数据能够传送到目的地,而且保证数据内容不会发生变化。TCP 就是一个可靠的协议。

不可靠的协议不保证数据能够传送到目的地,但是它们都会尽力传送数据,而且它们可以检验出到达目的地的数据是否完整。IP 和 UDP 就是不可靠的协议。

3、字节流协议与数据报协议

字节流协议表示发送方和接收方将传输的数据看成是一串连续的字节串流,先发出的数据将会被先接收到。TCP 就是这样的一个协议。

数据报协议与字节流不同,它会将数据一个一个地传送。发送方先后向接收方发出两个数据报,接收方并不知道哪一个数据报会先被收到。IP 和 UDP 就是这样的两个协议。如果要发送的信息不必讲求顺序,则可以选择 UDP 传输。而如果使用 UDP 发送有顺序的数据,并不是不可以,但是要对会先被收到。

二、TCP 协议

1、什么是 TCP

TCP(Transmission Control Protocol)即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议,保证了端到端数据传输的可靠性。

2、TCP 与 TCP/IP 的区别

TCP 是协议,而 TCP/IP 是协议族,前者是传输控制协议,后者是各类协议族的总称。

3、TCP 的特点

  • 面向连接
  • 可靠性
  • 基于字节流
  • 流量控制(拥塞控制):网络状况良好时提高发送/接收速率,反之降低,以提高对网络的利用率
  • 点到点的连接方式

4、TCP 段格式

TCP 段是 TCP 的基本传送单位,段格式如下:

各个字段功能如下:

来源端口(2字节):标识来源端口号。

目的端口(2字节):标识目的端口号。

序列号码(4字节):表明此封包在字节流中的顺序号(因为 TCP 是面向字节流的协议,需要保证最终的数据顺序与发送方发送的顺序一致,所以需要这个字段来表明该封包在字节流中的位置)

确认号码(4字节):对此前按顺序收到的最后一个封包的序列号码的确认(确认号 =n,表示 n-1 及其之前的封包都已经收到)

报头长度(1字节):指示报文头部的长度。

保留字段(10位):暂时没打算好干啥用,一律置 0。

标识符(6位):

  • URG:表示紧急指针是否有效。值为 1 表示有效,有高优先级的信息需要传输。
  • ACK:表示确认号是否合法。值为 1 表示合法。TCP 规定连接建立后,所有传送的报文段都必须把该字段置为 1。
  • PSH:推送数据。值为 1 指示接收方应尽快将这个报文段交给应用层,而不用等待缓冲区装满。
  • RST:对连接进行复位。值为 1 表示请求重新连接。可用于拒绝非法的报文段和拒绝连接请求。
  • SYN:在连接建立时对序列号进行同步。当建立一个新连接时,SYN 变为 1,在连接请求(Connection Request)中 SYN = 1, ACK = 0,连接响应(Connection Accepted)时 SYN = 1, ACK = 1
  • FIN:终止连接。值为 1 表示发送方没数据要传了,要求释放连接。

窗口(2字节):表示从确认号开始,本报文的源方可以接收的字节数,即源方接收窗口大小。用于流量控制。

校验和(2字节)对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。这是一个强制性的字段。

紧急指针(2字节):本报文段中的紧急数据的最后一个字节的序号。

选项字段(最多40字节):每个选项的开始是 1 字节的 kind 字段,说明选项的类型。

5、TCP 的超时重传

TCP 协议能够实现可靠传输的一个基本的原理--超时重传。

超时重传就是当接收方收到一个数据封包时会向发送方发送一个确认数据封包,而当发送方发送完一个数据封包经过一段时间没有收到接收方的确认封包时,就会向接收方再发送一次上个封包。

6、TCP 三次握手建立连接

TCP 三次握手(Three-way Handshake)是指建立一个 TCP 连接时,需要客户端和服务器总共发送 3 个包,主要是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。

在讲三次握手前先插播一个小故事。

有一天,小明到店里去买笔,于是跟老板有了以下对话:

小明:我要一支笔。
老板:你确定要一支笔?
小明:我确定要一支笔!

于是老板就给了小明一支笔……

这就是典型的 TCP 连接建立的过程。如下面的图:

上面的 ACK 表示 TCP 包头中的确认标识,三次握手过程如下:

  1. (我要一支笔。)客户端向服务器发送建立连接请求数据包,其中包头内容 SYN=1seq=x

  2. (你确定要一支笔?)服务器收到请求后,如果同意建立连接,就向客户端发送同意建立连接请求数据封包,其包头内容 SYN=1ACK=1seq=yack=x+1

  3. (我确定要一支笔!)客户端收到服务器发来的确认请求后,也向服务器发送确认封包,其内容 ACK=1seq=x+1ack=y+1 随后客户端就进入连接建立状态,而服务器就在收到这个确认封包后也进入连接建立状态。

为什么不是两次握手?

如果是两次握手,发送端可以确定对方能收到自己发的信息,也可以确定自己能收到对方发的包,但接收端只能确定自己能收到对方发的包,而无法确定对方能收到自己发的包。两次握手的话客户端有可能因为网络阻塞等原因发送多个请求报文,延时到达的请求又会与服务器建立连接,浪费服务器的资源。

三次握手过程中有哪些不安全性?

SYN flood 泛洪攻击

是什么?

伪装的 IP 向服务器发送一个 SYN 请求建立连接,然后服务器向该 IP 回复 SYN 和 ACK,但找不到该 IP 对应的主机,因此服务器收不到 ACK,导致重复发送。当大量攻击者请求建立连接时,服务器就会存在大量未完成三次握手的连接,导致服务器主机 backlog 被耗尽。

解决方法:

  • 降低 SYN timeout 时间,使主机尽快释放半连接的占用;
  • 采用 SYN cookie 设置,如果短时间内连续收到某个 IP 的重复 SYN 请求则认为受到该 IP 的攻击,丢弃来自该 IP 的后续请求报文;
  • 在网关处设置过滤,拒绝将一个源 IP 地址不属于其来源子网的包进行更远的路由。

7、TCP 四次挥手关闭连接

TCP 关闭一个连接需要经过四次挥手,之所以需要四次挥手,是因为服务端在收到客户端断开连接的 FIN 报文后,并不会立即关闭连接,而是先发送一个 ACK 包先告诉客户端自己已收到关闭连接的请求,等到服务器的所有报文发送完毕后,才发送 FIN 报文断开连接。

四次挥手过程如下:

  1. 客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态,停止发送数据,等待服务端的确认;
  2. 服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态;
  3. 如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态;
  4. 客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态,服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。

为什么最后一次挥手,客户端还要进入一个 TIME-WAIT 状态?

如果服务端没有收到客户端最后一次挥手发送的确认请求报文,服务端就会以为是自己的 FIN 报文段没发出去,导致客户端没有收到(客户端没收到就不会给它发送确认请求报文),于是服务器会再次发送 FIN 报文段,所以有一个时长为 2MSL 的等待时间。

8、TCP 应用场景

TCP 适用于对效率要求低,对准确性要求高的场景。

  • SMTP:电子邮件
  • TELNET:远程终端接入
  • HTTP:万维网
  • FTP:文件传输

9、TCP 扩展

  • 浏览器在与服务器建立 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开?

默认情况下建立 TCP 连接不会断开,只有在请求报头中声明 Connection: close 才会在请求完成后关闭连接。

  • 一个 TCP 连接可以对应几个 HTTP 请求?

如果维持连接的话,一个 TCP 连接是可以发送多个 HTTP 请求。

  • 一个 TCP 连接中 HTTP 请求发送可以一起发送吗?

HTTP/1.1 存在管线化技术可以完成这个多个请求同时发送,但由于浏览器默认关闭,所以可以认为这是不可行的;


HTTP2 存在多路复用技术,多个 HTTP 请求可以在同一个 TCP 连接中并行进行。
  • 为什么有的时候刷新页面不需要重新建立 SSL 连接?

TCP 连接有的时候会被浏览器和服务端维持一段时间。TCP 不需要重新建立,SSL 自然也会用之前的。

  • 浏览器对同一 Host 建立 TCP 连接到数量有没有限制?

有限制。Chrome 最多允许对同一个 Host 建立六个 TCP 连接,不同的浏览器有一些区别。

三、UDP 协议

1、什么是 UDP 协议

UDP(User Datagram Protocol)即用户数据报协议,是无连接的、不可靠的、基于数据报的传输层通信协议,在网络层的基础上实现了进程之间端到端的通信。

2、TCP 的特点

  • 无连接
  • 不可靠
  • 基于数据报
  • 传输速率快(虽然没有流量控制,但发送速率不受网络出现的拥塞影响)
  • 支持一对多、多对多的通信

3、UDP 报文头部格式

其中从 1 到 8 字节分别是来源端口号目的端口号报文长度检验和,每个字段各占两字节。

UDP 的通信方式较为简单,发送端发送完一个报文继续发送下一个,待将所有报文发送完毕通信就结束了。

接收方也是如此。

4、UDP 应用场景

TCP 适用于对效率要求高,对准确性要求低的场景。

四、TCP 与 UDP 的区别

TCPUDP
向上层提供面向连接的可靠服务向上层提供无连接不可靠服务
基于字节流基于数据报
有拥塞控制无拥塞控制
传输速率慢传输速率快
只能点对点全双工通信支持一对多、多对多的通信