第一章 了解Web及网络能基础
1、HTTP是什么
HyperText Transfer Protocol 超文本传输协议
2、HTTP当前使用较多的版本
http 1.1
3、TCP/IP协议族
一、协议族 解决了以下的问题 进而指定的一系列规则
1、怎样探测到通信的目标 目标
2、由哪一边发起通信 发
3、使用哪一种语言进行通信 发送中
4、怎样结束通信 发送完
二、TCP/IP的分层管理
应用层:向用户提供应用服务时的通信活动 FTP HTTP DNS
传输层:提供处于网络连接的两台计算机之间的数据传输 TCP UDP
网络层: 数据包通过怎样的路径到达目标地址 IP ARP RARP
链路层:用来处理网络的硬件部分 网卡
4、与HTTP协议关系密切的IP TCP DNS
IP地址 指明了节点被分配到的地址
MAC地址 网卡所属的固定地址
使用ARP协议凭借MAC地址进行通信
一、确保可靠性的TCP协议
TCP传输协议
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.
下面是一个TCP三次握手的实例
IP 192.168.1.116.3337 > 192.168.1.123.7788: S 3626544836:3626544836
IP 192.168.1.123.7788 > 192.168.1.116.3337: S 1739326486:1739326486 ack 3626544837
IP 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487,ack 1
第一次握手:192.168.1.116发送位码syn=1,随机产生seq number=3626544836的数据包到192.168.1.123,192.168.1.123由SYN=1知道192.168.1.116要求建立联机;
第二次握手:192.168.1.123收到请求后要确认联机信息,向192.168.1.116发送ack number=3626544837,syn=1,ack=1,随机产生seq=1739326486的包;
第三次握手:192.168.1.116收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,192.168.1.116会再发送ack number=1739326487,ack=1,192.168.1.123收到后确认seq=seq+1,ack=1则连接建立成功。
负责域名解析的DNS
Domain Name System 提供域名到ip的解析服务
5、URL的格式
http://user:pass@www.example....
协议:http https
登录信息:指定用户名和密码从服务器端获取资源时必须的登录信息
服务器地址:域名
服务器端口号:
带层次的文件路径:用来指定资源在服务器的位置
查询字符串:可选
片段标识符:可选 文档内的某个位置
第二章 简单的HTTP协议
HTTP方法
GET:获取资源
POST:传输实体主体
PUT 向服务器传输文件
HEAD 获得报文首部
DELETE 删除服务器上的文件
OPTIONS 询问服务器支持的方法
一种应用的场景 发送非简单的cors请求时 浏览器会首先发送options方法来询问服务器支持的方法。参见https://segmentfault.com/a/11...
http中的长连接
HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。在http1.0中使用Connection:keep-alive来标记这次请求是长连接的请求。
所以 如果web服务器端看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。
长连接vs短连接
所谓长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差,
所谓短连接指建立SOCKET连接后发送后接收完数据后马上断开连接,一般银行都使用短连接
使用cookie的状态管理
HTTP是无状态的协议 不对之前发生过的请求和响应的状态进行管理
浏览器第一次向服务器发起请求
浏览器第二次向该服务器发送请求
下面是步骤1 2 3分别对应的报文
1、请求报文
GET /reader/HTTP/1.1
HOST:hackr.jp
2、响应报文
HTTP/1.1 200 OK
Date:Tur,12 jul 2012 07:12:20 GMT
Server Apache
<set-cookie:sid=12211212121 ;path=/ expires=wed,10-0ct-12 >
Content-Type:text/plain charset=UTF-8
3、请求报文
GET /image /http/1.1
Host : hacker.jsp
Cokkie:sid=12211212121
第三章 HTTP报文内的HTTP信息
报文的结构
报文首部 报文主体(用于传输请求或响应的实体主体)
请求报文及响应报文的结构
请求报文的结构
报文首部:请求行(方法 URI http版本) 请求首部字段 通用首部字段 实体首部字段 报文主体
响应报文的结构
报文首部:状态行(状态码 原因短语 http版本) 响应首部字段 通用首部字段 实体首部字段 报文主体
第四章 服务器返回响应的状态码
状态码的类别
2xx 成功
200 ok 客户端发过来的请求被正常的处理
204 No Content 服务器接受的请求已被成功的处理 但是没有内容返回
比如说 浏览器发出的put delete 方法 服务器成功的处理了请求 但是不会返回任何的内容
206 partial Content 客户端进行了范围请求 而且服务器成功的处理了这个请求 在服务器的响应中包含由
Content-Range 指定范围的实体内容
3xx 重定向
301 Moved Permanently 永久性重定向 表示客户请求的文档在其他地方,必须在响应头部Location字段中指明新的永久性的URI。这个操作会将浏览器的书签也会改变
302 Found 临时重定向 这次的访问地址改变 但是浏览器中的书签不会被改变
304 Not Modified
可能会出现在以下的几种情况:
1、针对请求中的if-modified-Since 如果服务器没有更新 就会返回304 更新了就200
如果客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified 。因此,如果请求中包含 If Modified Since,就说明已经有缓存在客户端。只要判断这个时间和当前请求的文件的修改时间就可以确定是返回 304 还是 200 。对于静态文件,例如:CSS、图片,服务器会自动完成 Last Modified 和 If Modified Since 的比较,完成缓存或者更新。但是对于动态页面,就是动态产生的页面,往往没有包含 Last Modified 信息,这样浏览器、网关等都不会做缓存,也就是在每次请求的时候都完成一个 200 的请求。
2、当用户第一次访问某个静态资源的时候,服务器会返回
状态码:200
首部字段:Etag:dadmsdadks23
实体:相应的内容
当用户第二次请求该静态资源的时候会发送
首部字段:if-None-Math:w/dadmsdadks23
如果这个静态资源的实体值仍然为dadmsdadks23 就会返回304
4xx 客户端错误
400 Bad Request 该状态码 表示浏览器发起的请求中存在语法错误
401 Unauthorized 这个请求需要 HTTP认证
403 Forbidden 这次的请求被服务器拒绝了
404 Not Found 浏览器发起的请求的资源在服务器上没有找到
5xx服务器错误
500 Internal Server Error 服务器内部发生了错误
503 Service Unavailable 服务器不可用
第五章 与http协作的web服务器
通信数据转发程序 代理 网管 隧道
代理 有转发功能的应用程序 扮演了位于服务器和客户端 “中间人”的角色
网管 接受从客户端发送过来的请求 它就像自己拥有子单元的源服务器一样对请求进行处理
隧道 客户端和服务器之间进行中转 并保持双方通信连接的应用程序
第六章 HTTP首部
HTTP首部的种类
请求首部 响应首部 通用首部 实体首部
请求首部
1、Accept:text/plain,application/xhtml+xml,application/xml;q=0.3
通知服务器,我(客户端)能够处理的媒体类型及权重(0-1) 不指定权重的时候默认是1
2、Accept-charset:iso-8859-5,unicode-1-1;q=0.8
通知服务器,我(客户端)能够支持的字符集 及权重(0-1)
3、Accept-Ecoding:gzip,deflate
通知服务器,我(客户端)能够支持的内容编码
4、Accept-Language:zh-cn,zh;q=0.7,en-us,en;q=0.3
通知服务器,我(客户端)能够处理的自燃语言集及权重(0-1)
5、Authorization: Basic dwVub3N1jasasjai=
通知服务器,我(客户端)的认证信息。通常需要服务器认证的客户端会在收到响应401 未授权的时候再发出带有这样首部的一个请求 从而向服务器发送认证的相关信息
6、Expect:100-continue
通知服务器,我(客户端)期望的出现的某种特定的行为 当服务器无法理解客户端的期望做出响应时 相应的状态码为417 Expectation Failed
7、Host
通知服务器,我(客户端)请求的资源在 服务器的主机名和端口号
8、if-match:123456 <etag_value>
条件请求 服务器接收到这样的条件请求时 只有判断条件为真的时候 才会处理请求
(1)For GET 和 HEAD 方法,搭配 Range首部使用,可以用来保证新请求的范围与之前请求的范围是对同一份资源的请求。如果 ETag 无法匹配,那么需要返回 416 (Range Not Satisfiable,范围请求无法满足) 响应。
9、if-None-Match <etag_value>
当且仅当服务器上没有任何资源的 ETag 属性值与这个首部中列出的相匹配的时候,服务器端会才返回所请求的资源,响应码为 200
10、Range:byte=5001-10000
告知服务器 主需要返回 从第5001-10000字节的资源
11、refer:http://www.hacker.jp/index.html
告知服务器发起请求的 原始资源的URI 域名+资源名
12、User-Agent:Mozilla/5.0(windows NT)
告知服务器 我(客户端)访问服务器时正在使用的浏览器的版本
响应首部字段
1、Accept-Ranges:bytes
告知客户端,我(服务器)能够处理的请求范围
2、Age:600 //这个缓存向源服务器确认过 现在已经过去10分钟了
告知客户端,我(服务器)在多久之前创建了响应(秒) 表示消息对象在缓存代理服务器中存贮的时长
3、ETag: <etag_value>
服务器会为每份资源添加ETag 能够告知客户端这个实体的标识 将资源以字符串的形式作为唯一的标识,当资源更新的时候 字符串也需要更新
4、Location:http://www.newLocation.com
配合状态码 301 302 将浏览器引导到新的地址 进而实现重定向
5、Retry-After:120 //告诉客户端你等2分钟之后再发送请求
配合状态码503(服务器不可用)一起使用
6、Server:Apache/2.2.1
告知客户端,我(服务器)的信息
通用首部字段
1、Cache-control 以下是它可能的取值
缓存请求指令
no-cache----不要读取缓存中的文件,要求向WEB服务器重新请求 区别于no-store
no-store----请求和响应都禁止被缓存
max-age:60----表示当访问此网页后的1分钟内不会去服务器请求,
这个功能与Expires类似,只是Expires是根据某个特定日期值做比较。一但缓存者自身的时间不准确.则结
果可能就是错误的,而max-age,显然无此问题.。Max-age的优先级也是高于Expires的。
only-if-cached ---- 告知缓存者,我希望内容来自缓存,我并不关心被缓存响应,是否是新鲜的
缓存响应指令
public---- 可向任意方 提供响应的缓存
private---- 仅向特定的用户返回响应
no-cache---- 可以缓存,但是只有在跟WEB服务器验证了其有效后,才能返回给客户端 可以使用但是需要确认
no-store ---- 请求和响应都禁止被缓存
max-age:60 ----- 本响应包含的对象的过期时间 这个响应对象再有1分钟就过期了
2、Connection
这个字段有两个作用
[1]控制不再转发给代理的首部字段 connection:Upgrade
[2]管理持久连接 connection:close
在http1.1版本的连接默认都是持久连接。当服务器想要断开连接的时候 指定connection:close
3、Date:日期
创建报文的日期
4、via
可以追踪客户端与服务器之间的请求和响应报文的传输路径,报文在经过代理和网关时,会先在首部字段上附加该信息,然后再进行转发。
5、Trailer:Expires
表示的是在报文主体 之后还有的首部字段
实体首部
1、Allow:GET,HEAD
服务器通知客户端 我(服务器)能够支持的HTTP方法
2、Content-Encoding:gzip
会告知服务器或者客户端 实体主体的部分的编码
3、Content-Language:zh-CN
会告知服务器或者客户端 实体主体的使用的语言
3、Content-Length:1500
会告知服务器或者客户端 实体的长度
4、Content-Type:text/html;charset=UTF-8
说明了实体主体内容的媒体类型
5、Expires:Date类型
资源失效的一个日期
6、Last-Modified:Date
指明资源最终修改的时间
http中为cookie设置的首部
1、set-cookie:响应报文中 服务器向客户端设置cookie
set-cookie有以下的属性值:
[1]expires:date
指定cookie的过期时间,如果没有为cookie的expire赋值的话 cookie的有效期仅限于会话期间
[2]secure 没有值
限制web网页仅在https安全连接时 才可以发送cookie
[3]httpOnly 没有值
这个属性会使js无法更改cookie