Java:吊打面试官!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题( 二 )


  • 可靠的:无论的网络链路中出现了怎样的链路变化 , TCP 都可以保证一个报文一定能够到达接收端;
  • 字节流:消息是「没有边界」的 , 所以无论我们消息有多大都可以进行传输 。 并且消息是「有序的」 , 当「前一个」消息没有收到的时候 , 即使它先收到了后面的字节已经收到 , 那么也不能扔给应用层去处理 , 同时对「重复」的报文会自动丢弃 。
  • 什么是 TCP 连接?
    我们来看看 RFC 793 是如何定义「连接」的:
    Connections:
    The reliability and flow control mechanisms described above requirethat TCPs initialize and maintain certain status information foreach data stream.
    The combination of this information, includingsockets, sequence numbers, and window sizes, is called a connection.
    简单来说就是 , 用于保证可靠性和流量控制维护的某些状态信息 , 这些信息的组合 , 包括Socket、序列号和窗口大小称为连接 。
    Java:吊打面试官!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
    本文插图
    所以我们可以知道 , 建立一个 TCP 连接是需要客户端与服务器端达成上述三个信息的共识 。
    • Socket:由 IP 地址和端口号组成
    • 序列号:用来解决乱序问题等
    • 窗口大小:用来做流量控制
    如何唯一确定一个 TCP 连接呢?
    TCP 四元组可以唯一的确定一个连接 , 四元组包括如下:
    • 源地址
    • 源端口
    • 目的地址
    • 目的端口

    Java:吊打面试官!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
    本文插图
    TCP 四元组
    源地址和目的地址的字段(32位)是在 IP 头部中 , 作用是通过 IP 协议发送报文给对方主机 。
    源端口和目的端口的字段(16位)是在 TCP 头部中 , 作用是告诉 TCP 协议应该把报文发给哪个进程 。
    有一个 IP 的服务器监听了一个端口 , 它的 TCP 的最大连接数是多少?
    服务器通常固定在某个本地端口上监听 , 等待客户端的连接请求 。
    因此 , 客户端 IP 和 端口是可变的 , 其理论值计算公式如下:
    Java:吊打面试官!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
    本文插图
    对 IPv4 , 客户端的 IP 数最多为 2 的 32 次方 , 客户端的端口数最多为 2 的 16 次方 , 也就是服务端单机最大 TCP 连接数 , 约为 2 的 48 次方 。
    当然 , 服务端最大并发 TCP 连接数远不能达到理论上限 。
    • 首先主要是文件描述符限制 , Socket 都是文件 , 所以首先要通过 ulimit 配置文件描述符的数目;
    • 另一个是内存限制 , 每个 TCP 连接都要占用一定内存 , 操作系统是有限的 。
    UDP 和 TCP 有什么区别呢?分别的应用场景是?
    UDP 不提供复杂的控制机制 , 利用 IP 提供面向「无连接」的通信服务 。
    UDP 协议真的非常简 , 头部只有 8 个字节( 64 位) , UDP 的头部格式如下:
    Java:吊打面试官!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
    本文插图
    UDP 头部格式
    • 目标和源端口:主要是告诉 UDP 协议应该把报文发给哪个进程 。
    • 包长度:该字段保存了 UDP 首部的长度跟数据的长度之和 。
    • 校验和:校验和是为了提供可靠的 UDP 首部和数据而设计 。
    TCP 和 UDP 区别:
    1. 连接


    推荐阅读