脑图

  • TCP 基本认识
  • illustration>)

  • TCP 连接建立
  • illustration>)

  • TCP 连接断开
  • illustration>)

  • Socket 编程
  • illustration>)

    ---

    正文

    01 TCP 基本认识

    > 瞧瞧 TCP 头格式

    我们先来看看 TCP 头的格式-标注颜色的表示与本文关联比较大的字段-其他字段不做详细阐述。

    illustration>)TCP 头格式

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

    确认应答号:指下一次「期望」收到的数据的序列号-发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决不丢包的问题。

    控制位:

  • _ACK_:该位为 1 时-「确认应答」的字段变为有效-TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1
  • _RST_:该位为 1 时-表示 TCP 连接中出现异常必须强制断开连接。
  • _SYC_:该位为 1 时-表示希望建立连-并在其「序列号」的字段进行序列号初始值的设定。
  • _FIN_:该位为 1 时-表示今后不会再有数据发送-希望断开连接。当通信结束希望断开连接时-通信双方的主机之间就可以相互交换 FIN 位置为 1 的 TCP 段。
  • > 为什么需要 TCP 协议?TCP 工作在哪一层?

    IP 层是「不可靠」的-它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性。

    illustration>)OSI 参考模型与 TCP/IP 的关系

    如果需要保障网络数据包的可靠性-那么就需要由上层(传输层)的 TCP 协议来负责。

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

    > 什么是 TCP ?

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

    illustration>)

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

    我们来看看 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、序列号和窗口大小称为连接。

    illustration>)

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

  • Socket:由 IP 地址和端口号组成
  • 序列号:用来解决乱序问题等
  • 窗口大小:用来做流量控制
  • > 如何唯一确定一个 TCP 连接呢?

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

    illustration>)

  • 源地址
  • 源端口
  • 目的地址
  • 目的端口
  • illustrationTCP 四元组

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

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

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

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

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

    illustration

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

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

  • 首先主要是文件描述符限制-Socket 都是文件-所以首先要通过 ulimit 配置文件描述符的数目;
  • 另一个是内存限制-每个 TCP 连接都要占用一定内存-操作系统是有限的。
  • > UDP 和 TCP 有什么区别呢?分别的应用场景是?

    UDP 不提供复杂的控制机制-利用 IP 提供面向「无连接」的通信服务。

    UDP 协议真的非常简-头部只有 8 个字节( 64 位)-UDP 的头部格式如下:

    illustration>)UDP 头部格式

  • 目标和源端口:主要是告诉 UDP 协议应该把报文发给哪个进程。
  • 包长度:该字段保存了 UDP 首部的长度跟数据的长度之和。
  • 校验和:校验和是为了提供可靠的 UDP 首部和数据而设计。
  • TCP 和 UDP 区别:

    _1. 连接_

  • TCP 是面向连接的传输层协议-传输数据前先要建立连接。
  • UDP 是不需要连接-即刻传输数据。
  • _2. 服务对象_

  • TCP 是一对一的两点服务-即一条连接只有两个端点。
  • UDP 支持一对一、一对多、多对多的交互通信
  • _3. 可靠性_

  • TCP 是可靠交付数据的-数据可以无差错、不丢失、不重复、按需到达。
  • UDP 是尽最大努力交付-不保证可靠交付数据。
  • _4. 拥塞控制、流量控制_

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

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

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

  • FTP 文件传输
  • HTTP / HTTPS
  • 由于 UDP 面向无连接-它可以随时发送数据-再加上UDP本身的处理既简单又高效-因此经常用于:

  • 包总量较少的通信-如 DNS