1 HTTP协议基于TCP协议

(1)TCP三次握手连接

  • HTTP客户端(Chrome浏览器):

    • IP:192.168.1.47
    • 端口:59875
    • MSS:1460
  • HTTP服务器(Nginx服务器):
    • IP:45.76.37.162
    • 端口:80
    • MSS:1452
1 	8.893857	192.168.1.47	45.76.37.162	TCP	66	59875 → 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM=1
2 9.151584 45.76.37.162 192.168.1.47 TCP 66 80 → 59875 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1452 SACK_PERM=1 WS=128
3 9.151807 192.168.1.47 45.76.37.162 TCP 54 59875 → 80 [ACK] Seq=1 Ack=1 Win=66560 Len=0

(2)第一个HTTP请求

4 	9.152317	192.168.1.47	45.76.37.162	HTTP 461	GET / HTTP/1.1 

# 具体报文
Hypertext Transfer Protocol
GET / HTTP/1.1\r\n
Host: 45.76.37.162\r\n
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
\r\n

(3)第一个HTTP响应(HTML)

# ACK报文告知客户端我已收到请求,你可以准备接收我的数据了。
5 9.409851 45.76.37.162 192.168.1.47 TCP 60 80 → 59875 [ACK] Seq=1 Ack=408 Win=30336 Len=0
6 9.410305 45.76.37.162 192.168.1.47 TCP 1506 80 → 59875 [ACK] Seq=1 Ack=408 Win=30336 Len=1452 [TCP segment of a reassembled PDU]
7 9.410551 45.76.37.162 192.168.1.47 TCP 1506 80 → 59875 [ACK] Seq=1453 Ack=408 Win=30336 Len=1452 [TCP segment of a reassembled PDU]
8 9.410552 45.76.37.162 192.168.1.47 HTTP 1089 HTTP/1.1 200 OK (text/html)
9 9.410580 192.168.1.47 45.76.37.162 TCP 54 59875 → 80 [ACK] Seq=408 Ack=3940 Win=66560 Len=0 # 客户端返回收到确认 # 服务器返回的最后一个报文的部分HTTP报文(省略实体内容)
Hypertext Transfer Protocol
HTTP/1.1 200 OK\r\n
Server: nginx/1.12.2\r\n
Date: Wed, 21 Nov 2018 06:57:21 GMT\r\n
Content-Type: text/html\r\n
Content-Length: 3700\r\n # HTTP报文长为3700
Last-Modified: Tue, 06 Mar 2018 09:26:21 GMT\r\n
Connection: keep-alive\r\n
ETag: "5a9e5ebd-e74"\r\n
Accept-Ranges: bytes\r\n
\r\n
[HTTP response 1/2]
[Time since request: 0.258235000 seconds]
[Request in frame: 103]
[Next request in frame: 114] # 这里证明了一次TCP请求可以发送多次HTTP报文
[Next response in frame: 120]
File Data: 3700 bytes
  • HTTP报文太长了,一个TCP段无法发送完,于是分成了n份,n为多少呢?

    • HTTP报文长为3700,TCP MSS为1452,3700为HTTP实体大小 + HTTP首部(239)才是HTTP包的总大小 = 3939,3939 / 1452 = 3次。
  • TCP客户端怎么知道TCP服务端,分段发送已经完成?
    • 客户端HTTP请求时,发送PSH,ACK报文
    • 服务器先返回ACK报文,告知收到
    • 接着正式发送分段的HTTP报文(每次都是ACK)
    • 最后一段HTTP报文为PSH,ACK报文
  • 为什么HTTP请求时,发送的是PSH,ACK报文?
    • 因为只放ACK报文,服务器无法确认客户端是否发送完毕了。
    • 简而言之,PSH报文能够告知对方,我已发送完毕,请处理。

(4)第二个请求

10	9.419095	192.168.1.47	45.76.37.162	HTTP	404	GET /nginx-logo.png HTTP/1.1 

# 具体报文
Hypertext Transfer Protocol
GET /nginx-logo.png HTTP/1.1\r\n
Host: 45.76.37.162\r\n
Connection: keep-alive\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36\r\n
Accept: image/webp,image/apng,image/*,*/*;q=0.8\r\n
Referer: http://45.76.37.162/\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
\r\n

(5)第二个响应(图片)

11	9.679782	45.76.37.162	192.168.1.47	HTTP	660	HTTP/1.1 200 OK  (PNG)

# 具体报文(省略实体报文)
Hypertext Transfer Protocol
HTTP/1.1 200 OK\r\n
Server: nginx/1.12.2\r\n
Date: Wed, 21 Nov 2018 06:57:21 GMT\r\n
Content-Type: image/png\r\n
Content-Length: 368\r\n
Last-Modified: Tue, 06 Mar 2018 09:26:21 GMT\r\n
Connection: keep-alive\r\n
ETag: "5a9e5ebd-170"\r\n
Accept-Ranges: bytes\r\n
\r\n
[HTTP response 2/2]
[Time since request: 0.260687000 seconds]
File Data: 368 bytes
  • Content-Length = 368,但是TCP payload 为606,606 < 1452,一次发送完毕。HTTP首部为238字节。

(6)省略TCP的4次挥手断开连接

2 总结

  • HTTP协议基于TCP协议
  • HTTP报文过长需要TCP分段传输
  • 每次HTTP请求或响应都需要设置PSH标志为1,用于标志HTTP请求或响应完成
  • TCP的MSS由双方共同决定,选择最小的值(如:1452 < 1460,所以为MSS),短板效应(防止处理速度快的一方压垮慢的一方)
  • HTTP首部很长,上述两次首部一次为239字节,一次为238字节(HTTP2.0有改善,未来研究一下)。
  • HTTP1.1协议可以在一次TCP连接中,发送多次HTTP报文(HTTP1.0就不可以)

HTTP协议探究(序章)的更多相关文章

  1. WebSocket协议探究(序章)

    一 WebSocket协议基于HTTP和TCP协议 与往常一样,进入WebSocket协议学习之前,先进行WebSocket协议抓包,来一个第一印象. WebSocket能实现客户端和服务器间双向.基 ...

  2. CCNA+NP学习笔记—序章

    本人就读于南京捷式泰网络科技有限公司学习CCIE,这几天准备将多年来的纸质版笔记全部写成电子版献给大家以留下自己学习的足迹.本章是基础篇章,内容较少,主要为之后的内容做铺垫.所有笔记的分类顺序为:序章 ...

  3. Netty5序章之BIO NIO AIO演变

    Netty5序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使 ...

  4. Netty序章之BIO NIO AIO演变

    Netty序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用 ...

  5. php 伪协议探究

    0x01序 PHP伪协议探究 php中支持的伪协议有下面这么多 file:// — 访问本地文件系统 http:// — 访问 HTTP(s) 网址 ftp:// — 访问 FTP(s) URLs p ...

  6. HTTP协议探究(一):缓存

    一 复习与目标 1 复习 序章主要用WrieShark抓包HTTP报文 复习了TCP协议 讲述了TCP协议与HTTP之间的关系 HTTP1.1更新原因:HTTP1.0一次TCP连接只能发送一次HTTP ...

  7. .Net 中的反射(序章) - Part.1

    引言 反射是.Net提供给我们的一件强力武器,尽管大多数情况下我们不常用到反射,尽管我们可能也不需要精通它,但对反射的使用作以初步了解在日后的开发中或许会有所帮助. 反射是一个庞大的话题,牵扯到的知识 ...

  8. Asp.Net MVC4 + Oracle + EasyUI 学习 序章

    Asp.Net MVC4 + Oracle + EasyUI  序章 -- 新建微软实例 本文链接:http://www.cnblogs.com/likeli/p/4233387.html 1.  简 ...

  9. Ⅰ.Spring的点点滴滴--序章

    spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架 .net篇(环境为vs2012+Spring.Core.dll) 新建一个控制台 using Spring.Context; ...

  10. ar技术序章-SDK介绍和选择

    转自: http://blog.csdn.net/kun1234567/article/details/10402535 ar技术序章-SDK介绍和选择 分类: Augmented Reality20 ...

随机推荐

  1. 关系型数据库的树形结构查询(Oracle、Postgres)

    Oracle : start with… connect by 的用法.语法:select * from table [where 条件1] connect by[条件2] start with[条件 ...

  2. map初步(由ABBC--->A2BC)

    1.题目: Given a string containing only 'A' - 'Z', we could encode it using the following method: 1. Ea ...

  3. 定位ScheduledExecutorService过了一段时间不执行问题

    今天查看生产环境的sentinel控制台,发现某dubbo应用一共5个节点,有3个失联了. 查看失联节点的应用日志,服务没有挂,各dubbo接口的日志正常在打印. 在应用节点ping/telnet s ...

  4. 认识理解Java中native方法(本地方法)

      Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能. 可 ...

  5. x86架构64位模式下的寄存器列表

    在此列出x86架构处理器在64位模式下的可用寄存器列表,方便查阅- 这里要注意的是,在64位模式下,所有通用寄存器都能访问第8位部分,低16位部分以及低32位部分. 以下是64位模式下AMD64 AB ...

  6. Linux Mint设置自定义快捷键

    我使用的是 Linux Mint 19.2 Tina 先搜索键盘,把键盘的功能调出来 快捷键--->>自定义快捷键--->>添加自定义快捷键 名称可自定义(这里我定义的是“截图 ...

  7. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_02-vuejs研究-vuejs基础-MVVM模式

    1.2.1 MVVM模式 vue.js是一个MVVM的框架,理解MVVM有利于学习vue.js.   MVVM拆分解释为:   Model:负责数据存储 View:负责页面展示 View Model: ...

  8. HBase管理与监控——HMaster或HRegionServer自动停止挂掉

    问题描述 HBase在运行一段时间后,会出现以下2种情况: 1.HMaster节点自动挂掉: 通过jps命令,发现HMaster进程没了,只剩下HRegionServer,此时应用还能正常往HBase ...

  9. node-sass 安装失败解决方案

    从失败到成功,尝试了不下20,最终终于解决了: 解决方案如下: 参考方案一:http://www.jianshu.com/p/89f5e094b8ce(具体的配置看这个) 参考方案二:http://b ...

  10. Linear regression with one variable - Cost function intuition I

    摘要: 本文是吴恩达 (Andrew Ng)老师<机器学习>课程,第二章<单变量线性回归>中第8课时<代价函数的直观认识 - 1>的视频原文字幕.为本人在视频学习过 ...