简单分析下 HTTP 连接(内含 http-server 和 Tcpdump 的用法)

249 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

http-server

http-server 是一个简单的、零配置的命令行式静态 HTTP 服务器。

快速安装

npm install -g http-server   // 全局安装http-server

进入需要的文件夹 ,启动服务

http-sever [path] [options]  // path: 默认为当前文件夹;options: 配置选项

访问

  • 在浏览器地址栏输入 URL 访问
  • 其他设备连接,应当使用有 IP 的地址访问,且必须和本机在同一局域网下

端口占用

一般情况下,http-server 启动时,会默认使用 8080 端口,如果 8080 端口被占用,则会按序使用 80818082 等端口号。

  • 查看所有端口号占用: netstat
  • 查看占用某一端口的进程:h
  • 杀掉进程:kill -9 pid

Tcpdump

Tcpdump 是一个好用的抓包工具,可以用来抓取网络上的 TCP 包。

根据端口抓包:

sudo tcpdump port 8080 -n

注意事项

  • 需在其他设备中访问本地服务才能被抓取,本机浏览器访问本地服务不记录

抓包结果

一个完整的 HTTP 请求抓包截图:

截图1

截图2

根据截图中打印出来报文,我们可以研究下这个 HTTP 连接是怎么进行的,从而加深对 HTTP 的理解。

HTTP 连接分析

TCP 三次握手

第 1 次握手(175 -> 180)

在 19:10:17.154239 的时候,IP 为 10.32.147.175,端口为 52458(简称 175)的服务器向 IP 为 10.18.212.180,端口为 8080(简称 180)的服务器发了一个 TCP 包,标志位为 SYN,表示要建立一个连接,并指明包开始的序列号 seq(单位为字节),并告知能接收的最大报文段长度 miss 为 1460。

第 2 次握手(180 -> 175)

过了 366 微秒,在 19:10:17.154605 的时候,180 进行了回复,发送了一个 SYN + ACK 的报文段,表示同意和 175 建立连接。

第 3 次握手(175 -> 180)

在 19:10:17.159675 的时候,175 收到 SYN 后向 180 发送了一个 ACK 的报文段,同时改变接收窗口为 513 KB,完成了三次握手。

发送数据

建立好 TCP 连接后,在 19:10:17.159680 的时候,175 向 180 发送了一个 HTTP 请求,这里带有 PUSH 的标志位,表示是一个比较紧急的报文,要求 180 立即把数据从缓存中发送出来。发送的字节号为 [1, 447),这个报文总共发送了 446 个字节的数据,同时是一个 GET 请求。

180 收到后给 175 回复了一个 ACK 447,表示期待第 447 个字节的数据,即前面 447 个字节的数据都确认收到。

然后,180 进行了 HTTP 响应。

关闭连接

第 1 次挥手

在 19:10:22.345063 的时候,180 向 175 发送了一个 FIN 的报文段,表示要把请求关闭了。

第 2 次挥手

在 19:10:22.349400 的时候,175 向 180 发送了一个 ACK,这个时候连接处于半关闭状态,即 180 不可再向 175 发送数据了,但 175 还可以向 180 发送。

第 3 次挥手

在 19:10:35.232897 的时候,175 向 180 发送了一个 FIN,表示 175 也要关闭连接了。

第 4 次挥手

在 19:10:35.233083 的时候,180 收到后向 175 发送了一个 ACK,此时连接完全关闭。

总结

此外,我们还可以更深入的去学习下各标志位的含义,去思考三次握手和四次挥手的原因。