TCP协议

最后更新:2018-12-09

TCP 是一个工作在传输层可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。

TCP 是面向连接的、可靠的、基于字节流的传输层通信协议

  • 面向连接:一定是「一对一」才能连接,不能像 UDP 协议 可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;
  • 可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端;
  • 字节流:消息是「没有边界」的,所以无论我们消息有多大都可以进行传输。并且消息是「有序的」,当「前一个」消息没有收到的时候,即使它先收到了后面的字节已经收到,那么也不能扔给应用层去处理,同时对「重复」的报文会自动丢弃。

1. TCP首部格式

其中比较重要的字段有

  • 序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。

  • 确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决不丢包的问题。只有 ACK 标志位为 1 时,确认序号字段才有效,Ack=Seq+1。
  • 标志位(Flags):共 6 个,即 URG、ACK、PSH、RST、SYN、FIN 。六个标志位具体含义如下:

    • URG:紧急指针(urgent pointer)有效。
    • ACK:确认序号有效。该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1
    • PSH:接收方应该尽快将这个报文交给应用层。
    • RST:重置连接。该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。
    • SYN:发起一个新连接。该位为 1 时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。
    • FIN:释放一个连接。该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位置为 1 的 TCP 段。

2. TCP连接

客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫 TCP Connection 的东西。

由于 TCP 不存在连接的概念,只存在请求和响应,请求和响应都是数据包,它们之间都是经过由 TCP 创建的一个从客户端发起,服务器接收的类似连接的通道,这个连接可以一直保持,HTTP 请求是在这个连接的基础上发送的。

在一个 TCP 连接上是可以发送多个 HTTP 请求的,不同的版本这个模式不一样。

在 HTTP/1.0 中这个 TCP 连接是在 HTTP 请求创建的时候同步创建的,HTTP 请求发送到服务器端,服务器端响应了之后,这个 TCP 连接就关闭了。

HTTP/1.1 中可以以某种方式声明这个连接一直保持,一个请求传输完之后,另一个请求可以接着传输。

这样的好处是:在创建一个 TCP 连接的过程中需要“三次握手”的消耗,“三次握手”代表有三次网络传输。

如果 TCP 连接保持,第二个请求发送就没有这“三次握手”的消耗。HTTP/2 中同一个 TCP 连接里还可以并发地传输 HTTP 请求。

RFC 793 是如何定义「连接」的

Connections:

The reliability and flow control mechanisms described above require that TCPs initialize and maintain certain status information for each data stream.

The combination of this information, including sockets, sequence numbers, and window sizes, is called a connection.

简单来说就是,用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。

所以我们可以知道,建立一个 TCP 连接是需要客户端与服务器端达成上述三个信息的共识。

  • Socket:由 IP 地址和端口号组成
  • 序列号:用来解决乱序问题等
  • 窗口大小:用来做流量控制

2.1. 如何唯一确定一个 TCP 连接呢?

TCP 四元组可以唯一的确定一个连接,四元组包括如下:

  • 源地址
  • 源端口
  • 目的地址
  • 目的端口

源地址和目的地址的字段(32位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机。

源端口和目的端口的字段(16位)是在 TCP 头部中,作用是告诉 TCP 协议应该把报文发给哪个进程。

有一个 IP 的服务器监听了一个端口,它的 TCP 的最大连接数是多少?

服务器通常固定在某个本地端口上监听,等待客户端的连接请求。

因此,客户端 IP 和 端口是可变的,其理论值计算公式如下:

最大TCP连接数 = 客户端的IP数 * 客户端的端口数

对 IPv4,客户端的 IP 数最多为 232 次方,客户端的端口数最多为 216 次方,也就是服务端单机最大 TCP 连接数,约为 248 次方。

当然,服务端最大并发 TCP 连接数远不能达到理论上限。

  • 首先主要是文件描述符限制,Socket 都是文件,所以首先要通过 ulimit 配置文件描述符的数目;
  • 另一个是内存限制,每个 TCP 连接都要占用一定内存,操作系统是有限的。

为什么 UDP 头部没有「首部长度」字段,而 TCP 头部有「首部长度」字段呢?

原因是 TCP 有可变长的「选项」字段,而 UDP 头部长度则是不会变化的,无需多一个字段去记录 UDP 的首部长度。

为什么 UDP 头部有「包长度」字段,而 TCP 头部则没有「包长度」字段呢?

先说说 TCP 是如何计算负载数据长度:

TCP数据的长度 = IP总长度 - IP首部长度 - TCP首部长度

其中 IP 总长度 和 IP 首部长度,在 IP 首部格式是已知的。TCP 首部长度,则是在 TCP 首部格式已知的,所以就可以求得 TCP 数据的长度。

大家这时就奇怪了问:“ UDP 也是基于 IP 层的呀,那 UDP 的数据长度也可以通过这个公式计算呀?为何还要有「包长度」呢?”

这么一问,确实感觉 UDP 「包长度」是冗余的。

因为为了网络设备硬件设计和处理方便,首部长度需要是 4字节的整数倍。

可能是因为如果去掉 UDP 「包长度」字段,那 UDP 首部长度就不是 4 字节的整数倍了,才补充了「包长度」字段。

3. TCP 和 UDP 区别

UDP:用户数据报协议(User Datagram Protocol)。在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中处于第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,即,当报文发送之后,是无法得知其是否安全完整到达。

TCP:传输控制协议(Transmission Control Protocol)。当两台机器(网络设备)进行通信时,需要畅通且保证可靠,需要保证正确收发数据。当你想查看网页或数据文件下载时,希望完整且按顺序查看网页或者上传/下载完整的数据等就需要TCP了。

1. 连接

  • TCP 是面向连接的传输层协议,传输数据前先要建立连接。
  • UDP 是不需要连接,即刻传输数据。UDP 是面向数据报的、不可靠的、无序的传输协议。

2. 服务对象

  • TCP 是一对一的两点服务,即一条连接只有两个端点。
  • UDP 支持一对一、一对多、多对多的交互通信

3. 可靠性

  • TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达。
  • UDP 是尽最大努力交付,不保证可靠交付数据。

4. 拥塞控制、流量控制

  • TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。
  • UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。

5. 首部开销

  • TCP 首部长度较长,会有一定的开销,首部在没有使用「选项」字段时是 20 个字节,如果使用了「选项」字段则会变长的。
  • UDP 首部只有 8 个字节,并且是固定不变的,开销较小。

6. 有界性

TCP无界、UDP有界。TCP是字节流传输、UDP的数据包是单独的。

7. 传输速度

TCP传输慢,UDP传输快。TCP需要建立连接、保证可靠性和有序性,比较耗时。视频流、广播电视、在线多媒体游戏等选择使用UDP。

8. 量级

TCP是重量级的,UDP是轻量级的。TCP要建立连接、保证可靠性和有序性,就会传输更多的信息,如TCP的包头比较大。

小结

TCP是面向连接的、可靠的、有序的、速度慢的协议;UDP是无连接的、不可靠的、无序的、速度快的协议。

TCP开销比UDP大,TCP头部需要20字节,UDP头部只要8个字节。

TCP无界有拥塞控制,UDP有界无拥塞控制。

4. TCP 和 UDP 应用场景

由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:

  • FTP 文件传输
  • HTTP / HTTPS

由于 UDP 面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:

  • 包总量较少的通信,如 DNSSNMP
  • 视频、音频等多媒体通信
  • 广播通信
Edgar

Edgar
一个略懂Java的小菜比