整 理:曹燕 时 间:2016-03-04 说 明:http的定义、请求响应模型、TCP三次握手、使用wireshark工具抓包
1.定义
http: hypertext transfer protocol(超文本传输协议),是用于从WWW服务器传输超文本到本地浏览器的传送协议。http是互联网上应用最为广泛的网络协议。所有的WWW文件都必须遵守这个标准。它由请求和响应构成,是一个标准的客户端服务器模型。
2.http请求响应模型
http协议永远是客户端发起请求,服务器端回送响应。
http协议是一个无状态的协议,同一个客户端的这次请求和上次请求没有对应关系。
①http客户端发起请求,创建端口;
②http服务器在端口监听客户端的请求;
③http服务器向客户端返回状态和内容。
3.访问某个网址的整个流程
(1)建立连接
①chrome搜索自身的DNS缓存(如有没有baidu.com及ip地址,一般缓存1分钟,如果有缓存看是否过期)【方法:chrome://net-internals/#dns】;
②当浏览器没有找到缓存或缓存已经过期,则搜索操作系统自身的DNS缓存;
③如果没找到,则读取本地的host文件;
④如果host文件中没有,则浏览器发起一个DNS的系统调用;
⑤宽带运营商服务器查看自身缓存;
⑥运营商服务器发起一个迭代的DNS解析请求;
⑦运营商服务器把结果返回操作系统内核并缓存起来;
⑧操作系统内核把结果返回给浏览器;
⑨最终浏览器拿到了www.baidu.com的ip地址
⑩浏览器获得对应的ip地址之后,发起三次握手。(详见下文)
(2)浏览器发送请求
TCP/IP连接建立起来之后,浏览器就可以向服务器发送请求了。例如用http中的get方法请求一个根域里的一个域名,采用了http1.0的某个协议;【应用于资源的方法、资源的标识符和协议的版本号】
(3)服务器返回响应
服务器接受这个请求,根据路径参数,经过后端的一些处理,把处理之后的结果数据返回给浏览器(例如百度的html页面)【信息的协议版本号、状态码,MIME信息包括服务器信息、实体信息和可能的内容】
(4)浏览器渲染
浏览器拿到了百度的完整html页面代码,在解析和渲染这个页面的时候,里面的css/js/静态图片等静态资源,同样是一个个http请求,需经过前面的7步。
浏览器根据拿到的资源对页面进行渲染,最终把一个完整的页面呈现给用户,然后与服务器断开连接。
3.TCP连接中的三次握手
3.1概念
确认比特ACK——只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效;
同步比特SYN——同步比特SYN置为1,就表示这是一个连接请求或连接接受报文;
3.2三次握手
①浏览器:客户端发送syn包到服务器,并进入SYN_SENT状态,等待服务器确认【你能听到我说话吗,我们聊聊?】
②服务器:服务器收到syn包,必须确认客户的SYN,同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态【我能听到你说话,我们可以聊聊】
③浏览器:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手【好的,那我们开始聊吧】
4.http请求头
- Accept:浏览器可接受的MIME类型;
- Accept-Charset:浏览器可接受的字符集;
- Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip;
- Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到;
- Authorization:授权信息;
- Connection:表示是否需要持久连接。如果这里的值为“Keep-Alive”,或者请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间;
- Content-Length:表示请求消息正文的长度;
- Cookie:这是最重要的请求头信息之一;
- Host:初始URL中的主机和端口;
- If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答;
- Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝;
- Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面;
- User-Agent:浏览器类型。
5.http响应头
- Allow:服务器支持哪些请求方法(如GET、POST等);
- Content-Encoding:文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型;
- Content-Length:表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据;
- Content-Type: 表示后面的文档属于什么MIME类型,如text/plain,text/html;
- Date:当前的GMT时间;
- Expires:指明应该在什么时候认为文档已经过期,从而不再缓存它;
- Last-Modified:文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态;
- Location:表示客户应当到哪里去提取文档;
- Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计。