我是个很自私的人,我通常很讨厌写技术分享。
我更喜欢写一下与技术无关的东西,更喜欢不写,请尊重劳动成果。
因为我觉得这个世界并没有谁会在意。
Tip:图比文字重要
# 这是一篇关于TCP/HTTP详解的文章
这是我上网找个一个图,请先初略的浏览一下
# 三次握手
- 客户端首先向服务器端发送一个请求包。
- 服务器收到之后,同样给客户端发送一个(请求+确认)包
- 客户端在收到服务器发送过来的(请求+确认)包,再给服务器一个发送一个确认包
# 四次挥手(通常2、3会在一起)
- 客户端请求断开
- 服务器确认,服务器请求断开
- 客户端确认
首先使用WireShark
选择好网卡之后,在过滤栏目输入你想要抓取的协议(TCP)
我们这里选取了这一条。
表面上我们可以看到这些信息
- Source:172.16.16.44
- Destination: 180.97.161.108
- Length: 66
- Info: 从本机的49561->80端口
- 是一个带有ACK(确认)的包
- Seq: 274
- Ack(确认号=上一个包的Seq+1): 1346
- Win(窗口大小):65280
在过滤窗口输入ip.addr == 172.16.16.44 && tcp
过滤掉不需要的,红线框住的就是一个三次握手。
这个主要是IP(缩写)里面封装的信息(红线框内),从172.16.16.44到202.181.159.92
Transmission Control Protocol缩写就是TCP,里面封装了TCP端口到端口的协议
可以看见flag里面的SYN位是为Set的
可以看到这是从服务器发回给本机172.16.16.44的一个(SYN+ACK)确认包。
并且ACK = 上一次SEQ + 1
本机在收到之后,再向服务器发送一个确认包,完成三次握手。
建立TCP链接完成之后,我们的HTTP协议就可以开始工作了,对服务器请求数据。
- 从172.16.16.44到220.181.159.92
- 协议:HTTP
- 长度为1242
- 提交方式POST
- 请求的地址: /index.php
- 版本信息:HTTP/1.1
可以看见里面有一个Hypertext Transfer Protocol,缩写就是HTTP,我们把他打开来看一看。
- 请求的URI为 /index.php
- 主机Host:site.browser.360.cn
- User-agent: 发送请求的客户端的浏览器信息
- Content-type:内容类型,form-data表单数据,因为这是用POST的方式进行提交的。
- Cookie:包含浏览器的一些cookie信息
- 完整URI:http://site.browser.360.cn/index.php
我们再找一个HTTP响应的报文
- 状态号:200
- 请求版本:http/1.1
- Server版本:nginx服务器
- Date:时间
- Expires:过期时间
- Content-Type:文档类型
- Content-Encoding: gzip 使用gzip压缩
- X-Cache: MISS from cache.51cdn.com 没有从cdn上面下载缓存
- X-Via: 1.1 lsh213:8110 (Cdn Cache Server V2.0), 1.1 baoji26:10 (Cdn Cache Server V2.0)缓存服务器的一些信息
这里由于一次性抓到了,就直接说了
- HTTP发送了请求之后,服务器发送回来一个ACK确认,生成一个新的ACK确好,并且发送给客户端HTTP响应,完成后。
2.客户端给服务器端发送FIN确认,并且SEQ=上一次的ACK
3.服务器接收到客户端来的FIN,服务器也向客户端发送一个FIN,SEQ=上一ACK,ACK=上一次SEQ+1
4.最终客户端向服务器端发送一个ACK确认断开。
其实下面还有我用 PackTracer,物理流程的TCP/HTTP,更多。看各位的评论再上传了。光是排版这么点我就花了半个小时。