01_HTTP,TCP,curl
约 1076 字大约 4 分钟
2025-09-24
1. HTTP 与 TCP 的关系
- HTTP 本身是应用层协议,它定义了浏览器和计算机之间如何交互请求和响应。
- HTTP 并不是“直接使用 TCP”,而是通常基于 TCP 来传输数据(HTTP/1.1、HTTP/2 使用 TCP;而HTTP/3 使用 QUIC/UDP)。
- TCP 既是一套协议规范,也是操作系统内核中实现的协议栈(TCP/IP 协议栈)的一部分。
当应用程序(比如 Web 服务器或浏览器)发起 HTTP 请求时,实际的连接建立、数据分段、重传、拥塞控制、流量控制 等工作,都由操作系统内核的 TCP 模块负责完成。应用程序只需通过 socket 接口(如connect()、send()、recv())与内核交互,而无需自己实现 TCP 的任何细节。
2. 浏览器请求网页的过程
DNS 解析:浏览器将域名解析为服务器 IP。
建立连接:浏览器通过 Socket API(如
socket()+connect())向服务器发起 TCP 连接。客户端会随机选择一个 临时端口(ephemeral port),例如 52341。
服务器监听在 443 端口(HTTPS),或 80 端口(HTTP)。
连接实际上是:
客户端IP:52341 <——TCP连接——> 服务器IP:443
三次握手:TCP 建立连接,确保可靠传输通道存在。
TLS 握手(若为 HTTPS):在 TCP 连接上进行 TLS 加密协商。
传输数据:浏览器发送 HTTP 请求报文,服务器返回 HTTP 响应报文。
3. “HTTP 报文送到 TCP”是什么意思?
从应用层(HTTP 客户端)角度:调用 Socket API(如
send()),把 HTTP 报文交给操作系统。在操作系统内部:
- 内核的 TCP 模块接收报文字节,放进 发送缓冲区。
- TCP 协议栈将报文切分为合适大小的 TCP 段(segment)。
- 每个段加上 TCP 头部(端口、序列号、校验和等)。
- 交给 IP 层,继续封装为 IP 数据报。
- 最终交给链路层/物理层,经由网卡发出。
因此,“送到 TCP”实际上就是:应用层把数据交给内核的 TCP 协议栈,由它负责分段、加头、传递给下层。
4. TCP 的物理实现
- TCP 不是硬件,而是操作系统内核里的一个软件模块:
- 运行在 CPU 上。
- 使用内存缓冲区存放待发送和接收的数据。
- 网卡只懂链路层和物理层,它并不了解 TCP 协议。
- 网卡收发的是以太网帧。
- 报文送到主机后,由驱动交给内核协议栈,逐层剥离直到 TCP 层。
5. HTTP是无状态协议
在服务器向客户发送被请求的文件时,服务器本身不会存储任何关于该客户的状态信息。比如说某个客户在几秒内多次重复 请求同一个对象,服务器并不会因为刚刚为该客户提供此对象就不再做出反应,而是重新发送该对象,就像服务器已经忘记 之前做过的事情一样。这也就是为什么常说 HTTP协议是一个无状态协议。
但无状态要和缓存区分开来,从HTTP的方向来看,服务器的确不会记录HTTP的内容,但实际上浏览器,中间件(nginx和redis),服务器的管理者往往为了进一步获取客户数据,减轻服务器压力的情况下,会在外面套一层缓存或者 Cookies,Token 来实现"记忆"。
Curl命令的讲解
在日常工作中,经常会有同事说某某网站打不开了,不管是公网还是内网环境,最快也最直观的方式就是使用Curl命令测一下对应的网站,根据返回的报错就能很直观的指导究竟是哪里的问题
Curl命令的基础用法
curl https://目标网站可选项
这些可选项都是可以叠加使用的
curl -[option]- L:自动跟随重定向(302/301 等)
- X:指定 HTTP 方法(GET/POST/PUT/DELETE/HEAD/PATCH 等)
- v:显示详细的请求/响应过程,包括头部和连接信息
- k:忽略证书(处理自签证书的时候经常用)
