携手创作,共同成长!这是我参与「掘金日新计划 · 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 端口被占用,则会按序使用 8081、8082 等端口号。
- 查看所有端口号占用:
netstat - 查看占用某一端口的进程:
h - 杀掉进程:
kill -9 pid
Tcpdump
Tcpdump 是一个好用的抓包工具,可以用来抓取网络上的 TCP 包。
根据端口抓包:
sudo tcpdump port 8080 -n
注意事项
- 需在其他设备中访问本地服务才能被抓取,本机浏览器访问本地服务不记录
抓包结果
一个完整的 HTTP 请求抓包截图:
根据截图中打印出来报文,我们可以研究下这个 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,此时连接完全关闭。
总结
此外,我们还可以更深入的去学习下各标志位的含义,去思考三次握手和四次挥手的原因。