Socket、端口与 TCP 首部关键字段
一、先说结论
这一篇主要解决四类高频问题:
- Socket 是什么?它和 HTTP、TCP 是什么关系?
- 常见端口有哪些?80、443、22、3306 分别是什么?
- TCP 首部有哪些关键字段?
- SYN、ACK、FIN、RST 分别有什么作用?
如果先把主线压缩成几句话,可以这样记:
- Socket 是程序使用网络能力的接口抽象
- TCP/UDP 是传输层协议,Socket 是应用程序和协议栈之间的编程接口
- HTTP 通常跑在 TCP 之上,程序通过 socket 收发 HTTP 数据
- 端口号用于把数据交给正确的进程
- TCP 首部里最核心的字段包括源端口、目标端口、序列号、确认号、窗口大小、校验和、标志位等
- SYN 用于建连,ACK 用于确认,FIN 用于优雅关闭,RST 用于强制复位连接
二、Socket 到底是什么
Socket 中文通常翻译成:
套接字
但如果只背这个词,其实没什么帮助。更容易理解的说法是:
Socket 是应用程序使用网络通信能力时,对底层连接或通信端点的一种抽象接口。
你可以把它理解成:
- TCP / UDP 是底层协议规则
- Socket 是程序员在代码里真正拿来“发数据、收数据、建连接、监听端口”的对象或接口
所以:
- TCP 不是 Socket
- Socket 也不是 TCP 本身
更准确地说:
Socket 是应用程序操作 TCP/UDP 等协议能力的入口。
三、Socket 和 TCP、HTTP 的关系是什么
这个问题很容易混,最好分层来说。
1. TCP 是传输层协议
TCP 规定的是:
- 如何建立连接
- 如何可靠传输
- 如何编号、确认、重传
- 如何做流量控制和拥塞控制
也就是说,TCP 解决的是:
数据怎么可靠地从一端送到另一端
2. HTTP 是应用层协议
HTTP 规定的是:
- 请求怎么写
- 响应怎么写
- 方法、状态码、请求头、响应头是什么语义
所以 HTTP 解决的是:
客户端和服务端到底在“说什么话”
3. Socket 是编程接口
程序真正写代码时,不会直接“操作抽象的 TCP 规则”,而是通过 socket:
- 服务端
listen accept- 客户端
connect - 双方
read/write或send/recv
因此可以把三者关系理解成:
应用程序
↓ 通过 socket 编程接口
TCP / UDP
↓
IP
↓
网卡 / 链路如果是 HTTP 服务,通常就是:
HTTP 报文
通过 socket 写入
交给 TCP 传输所以一句话概括:
HTTP 是通信内容,TCP 是传输规则,Socket 是程序使用这些能力的接口。
四、监听 Socket 和已连接 Socket 是什么关系
这个点和前面的三次握手、全连接队列也能串起来。
1. 监听 Socket
服务端先创建一个监听 socket,例如监听 8080 端口。
它的作用是:
等新的客户端连接进来
但它本身不是某个具体客户端连接。
2. 已连接 Socket
当客户端完成三次握手后,服务端调用 accept(),会拿到一个新的已连接 socket。
这个 socket 才真正对应:
某一个具体客户端连接
所以常见关系是:
- 一个
listen socket负责监听 - 多个
connected socket分别负责和多个客户端通信
五、端口号是干什么的
IP 地址只能把数据送到某台机器。
但一台机器上可能同时运行很多网络程序,例如:
- Nginx
- MySQL
- SSH
- Redis
- 你的后端应用
这时操作系统就需要一个机制来区分:
这个数据该交给哪一个进程 / 服务处理
这个机制就是:
端口号
所以你可以理解成:
- IP 地址:找到哪台机器
- 端口号:找到机器上的哪个程序
六、常见端口有哪些
1. 80
HTTP默认明文网页访问端口。
2. 443
HTTPS默认加密网页访问端口。
3. 22
SSH远程登录 Linux 服务器最常见的端口。
4. 3306
MySQLMySQL 数据库默认端口。
5. 还常见的几个补充
6379:Redis8080:很多 Web 服务常用测试端口53:DNS
但面试里你至少把 80 / 443 / 22 / 3306 说对就够了。
七、TCP 首部有哪些关键字段
TCP 首部字段很多,但面试里最常被问的是这些。
1. 源端口 / 目标端口
作用:
标识两端的进程端点
2. 序列号(Sequence Number)
作用:
表示当前报文段中数据在整个字节流中的起始位置
它是 TCP 可靠传输、有序交付的核心基础之一。
3. 确认号(Acknowledgment Number)
作用:
告诉对方“我下一个期望收到哪个字节”
例如:
ack = 6通常表示:
- 1~5 已经连续收到
- 下一次请从 6 开始发
4. 窗口大小(Window)
作用:
通告当前还能接收多少数据
它和流量控制直接相关。
5. 校验和(Checksum)
作用:
检查报文在传输过程中有没有损坏
6. 标志位(Flags)
常见的就包括:
- SYN
- ACK
- FIN
- RST
它们用来表示当前这个 TCP 报文在连接管理和确认过程中的语义。
八、SYN、ACK、FIN、RST 分别有什么作用
1. SYN
SYN 的作用是:
发起建立连接请求
它通常出现在三次握手里。
例如:
- 第一次握手:客户端发 SYN
- 第二次握手:服务端回 SYN + ACK
你可以记成:
SYN = 我想建立连接
2. ACK
ACK 的作用是:
确认对方的数据或控制报文已经收到
它不只在握手 / 挥手里用,在正常数据传输中也大量存在。
你可以记成:
ACK = 我知道了 / 我收到了
3. FIN
FIN 的作用是:
表示我这边已经没有数据要发了,希望关闭这个发送方向
它通常出现在四次挥手里。
注意:
- 发 FIN 不等于连接立刻完全关闭
- 它更准确表示“我这边不再发送了”
4. RST
RST 的作用是:
强制复位连接
常见场景:
- 连接异常
- 端口没人监听
- 收到明显非法或不该出现的报文
- 主动直接中断连接而不是优雅挥手
你可以记成:
RST = 这条连接别继续了,直接重置
九、为什么 RST 和 FIN 不一样
这个点面试里容易追问。
FIN
是:
优雅关闭
意味着:
- 我这边没数据发了
- 但仍按 TCP 规则走关闭流程
RST
是:
强制打断
意味着:
- 不走完整挥手流程
- 更像异常中止或立即复位
所以:
FIN更温和RST更激烈
十、面试版回答
如果面试官问“Socket 是什么,它和 HTTP、TCP 什么关系”,可以这样答:
Socket 是应用程序进行网络通信时使用的编程接口抽象,可以理解为程序操作 TCP/UDP 等协议能力的入口。TCP 是传输层协议,负责连接建立、可靠传输、重传和流量控制;HTTP 是应用层协议,负责定义请求和响应的语义与格式。应用程序通常通过 socket 收发 HTTP 数据,而这些数据再由 TCP 负责可靠传输。
如果面试官问“TCP 首部关键字段和 SYN、ACK、FIN、RST 的作用”,可以这样答:
TCP 首部里常见关键字段包括源端口、目标端口、序列号、确认号、窗口大小、校验和以及标志位等。其中源端口和目标端口用于标识通信进程;序列号和确认号是可靠传输的核心基础;窗口大小用于流量控制;校验和用于检查报文完整性。标志位里,SYN 表示建立连接请求,ACK 表示确认对方报文已收到,FIN 表示本端没有数据要发了、准备优雅关闭连接,RST 表示异常情况下对连接进行强制复位。
十一、一句话总结
- Socket:程序使用网络通信能力的接口
- TCP:负责把数据可靠送到对方
- HTTP:规定双方到底怎么说话
- 端口:决定数据该交给哪个程序
- SYN / ACK / FIN / RST:决定 TCP 连接怎么建立、确认、关闭或强制中断
