简单描述HTTP协议流程,仅供自己学习,有时间会逐渐深入添加
解析地址
在浏览器中输入地址后,浏览器会先解析域名,拿到对应的IP
解析域名的过程:
1.从浏览器缓存中找
2.从系统缓存中找
3.从路由器缓存中找
4.ISP DNS缓存中找
封装HTTP请求数据包
封装的HTTP请求数据包包括四个部分
*请求行<request-line>
*请求头部<headers>
*空行<blank-line>
*请求数据<request-body>
建立TCP连接(TCP的三次握手)

1) Client首先发送一个连接试探,ACK=0 表示确认号无效,SYN = 1 表示这是一个连接请求或连接接受报文,同时表示这个数据报不能携带数据,seq = x 表示Client自己的初始序号(seq = 0 就代表这是第0号包),这时候Client进入syn_sent状态,表示客户端等待服务器的回复
2) Server监听到连接请求报文后,如同意建立连接,则向Client发送确认。TCP报文首部中的SYN 和 ACK都置1 ,ack = x + 1表示期望收到对方下一个报文段的第一个数据字节序号是x+1,同时表明x为止的所有数据都已正确收到(ack=1其实是ack=0+1,也就是期望客户端的第1个包),seq = y 表示Server 自己的初始序号(seq=0就代表这是服务器这边发出的第0号包)。这时服务器进入syn_rcvd,表示服务器已经收到Client的连接请求,等待client的确认。
3) Client收到确认后还需再次发送确认,同时携带要发送给Server的数据。ACK 置1 表示确认号ack= y + 1 有效(代表期望收到服务器的第1个包),Client自己的序号seq= x + 1(表示这就是我的第1个包,相对于第0个包来说的),一旦收到Client的确认之后,这个TCP连接就进入Established状态,就可以发起http请求了。
客户端发送请求命令
开始发送http请求
服务器响应
回应请求
返回数据
返回的数据包包括四个部分
*状态行<status-line>
*响应头部<headers>
*空行<blank-line>
*响应数据<response-body>
服务器关闭TCP连接
如果返回的Connection为keep-alive,则TCP请求将会保持一段时间,期间可继续请求,如果没有则直接断开请求
网友评论