- 第一个包是「第一次握手」:我(192.168.2.121)向百度(39.156.66.10)发送一个 SYN ,表示这是一个「建立连接的请求」
- 第二个包是「第二次握手」:百度(39.156.66.10)响应我(192.168.2.121)一个 SYN+ACK ,表示这是一个「接受连接的应答」
- 第三个包是「第三次握手」,我(192.168.2.121)向百度(39.156.66.10)发送一个 ACK ,表示这一个「确认请求」
- 发送完确认请求后,我开启到百度的「单向连接通道」;百度收到我的确认请求后,就开启到我这边的单向连接通道;「两边通道」都开启以后,就可以通信了。
2)再看中间三个包,TCP连接建立以后,开始「HTTP的请求和响应」
- 第一个包是,我(192.168.2.121)向百度(39.156.66.10)发送了一个「HTTP请求」,请求类型是HEAD
- 第三个包是,百度(39.156.66.10)向我(192.168.2.121)发送了一个「HTTP响应」,响应状态码是 200 OK
3)再看最后四个包,请求响应结束后,「TCP四次挥手」断开连接。
- 第一个包是第一次挥手,我(192.168.2.121)向百度(39.156.66.10)发送一个FIN+ACK,表示这是一个释放连接的请求
- 第二个包是第二次挥手,百度(39.156.66.10)向我(192.168.2.121)响应一个ACK,表示这是一个确认请求;我收到后,就会释放我到百度的单向连接
- 第三个包是第三次挥手,百度(39.156.66.10)向我(192.168.2.121)发送一个FIN+ACK,表示这是一个释放连接的请求
- 第四个包是第四次挥手,我(192.168.2.121)向百度(39.156.66.10)响应一个ACK,表示这是一个确认请求;百度收到后,就会释放到我这边的单向连接
- 双向的连接都释放后,TCP连接就关闭了,此次通信结束
第四步:分析HTTP协议报文
HTTP协议请求、响应报文如下图:
- 请求报文分为三个部分:请求行、请求头、请求体
- 响应报文分为四个部分:状态行、响应头、响应空行、响应体
1)先来看HTTP请求包,找到HyperText Transfer Protocol这一栏,就是HTTP的报文了
主要看我圈中的地方,上面是请求行,中间是请求头
- 请求行:包含请求方法、请求URL、HTTP版本
- 请求头:包含请求的客户端的信息,一行一个请求头
- 请求体:POST等类型的请求才有请求体,这里没有
点开请求行,看里面的三个字段:
- Request Method:请求方法,这里的请求方法是HEAD,用来获取报文首部
- Request URI:请求的URL,因为我们没指定,所以默认是/
- Request Version:请求的版本,因为用的是HTTP协议,所以这里显示HTTP协议的版本
再看下面的几个请求头:
- Host:目标主机
- User-Agent:代理,也就是浏览器的类型。我们用的不是浏览器,所以这里显示的是命令curl
- Accept:浏览器可接受的MIME类型
2)再看HTTP响应包,找到HyperText Transfer Protocol这一栏,也就是HTTP的报文
注意看我圈中的地方,上面是状态行,下面是响应头。
- 状态行:包含版本和响应状态码、状态信息
- 响应头:包含响应的服务器的资源信息,一行一个响应头
- 响应空行:用来间隔/区分响应头和响应体
- 响应体:服务器响应的内容,通常是一个HTML页面的代码或者给客户端的数据。
响应报文跟我们命令执行的返回结果其实是一样的。因为请求方式是 HEAD,只是获取头部信息,所有这里没有响应体,但能明显看到最后多了一行空格,也就是响应空行。
点开状态行,可以看到里面有三个字段:
- Response Version:响应版本,因为使用的是HTTP协议,所以这里显示了HTTP的版本
- Status Code:响应状态码,这里的 200 表示请求成功。
- Response Phrase:响应状态码的提示信息
再看下面的这些响应头:
- Date:服务端发送响应报文的时间
- Server:服务器和相对应的版本
- Last-Modified:请求的对象创建或者最后修改的时间
- ETag:对象的标志值,如果对象修改了,这个值也会变,用来判断对象是否改变
- Accept-Ranges:支持的范围单位
- Content-Length:内容长度
- Cache-Control:缓存控制
- Expires:这个时间前,可以直接访问缓存副本
- Connection:连接类型,Keep-Alive表示这是一个长链接,可以继续用这个连接通信
- Content-Type:资源文件类型
写在最后
在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。
需要完整版PDF学习资源私我
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!