目录
一、URL和URI
- URI(Uniform Resource Identifier,统一资源标识符): 在于Identifier,可以唯一标识一个资源。可以是一个名字、一串编号、一个URL(说明URL是一种URI)......
- URL(Uniform Resource Locator,统一资源定位符):在于Locater,可以唯一定位该资源的路径 。
- URL是URI的子集(URL一定是URI,但URI不一定是URL)
“RFC3986:统一资源标识符(URI)通用语法”中列举了几种 URI 例 子,如下所示。
- ftp://ftp.is.co.za/rfc/rfc1808.txt (also a URL because of the protocol)
- http://www.ietf.org/rfc/rfc2396.txt (also a URL because of the protocol)
- ldap://[2001:db8::7]/c=GB?objectClass?one (also a URL because of the protocol)
- mailto:John.Doe@example.com (also a URL because of the protocol)
- news:comp.infosystems.www.servers.unix (also a URL because of the protocol)
- tel:+1-816-555-1212
- telnet://192.0.2.16:80/ (also a URL because of the protocol)
- urn:oasis:names:specification:docbook:dtd:xml:4.1.2
二、HTTP请求的准备
1、通过DNS解析,将域名解析为IP地址。
2、HTTP协议时基于TCP协议的,当然要先通过TCP三次握手建立TCP连接了。
目前使用的 HTTP 协议大部分都是 1.1。在 1.1 的协议里面,默认是开启了 Keep-Alive 的,这 样建立的 TCP 连接,就可以在多次请求中复用。
三、HTTP 请求的构建
请求报文由四个部分组成,分别是:请求行、请求头、空行和请求实体
1、请求行
1.1 常用请求方法
get:去服务器获取一些资源。对于网页就是获取页面。返回格式可以是JSON字符串,不过取决于服务器端实现决定。
post:主动告诉服务器一些信息(例如提交表单)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT:向指定资源位置上传最新内容。
- HTTP 的服务器往往是不允许 上传文件的,所以 PUT 和 POST 就都变成了要传给服务器东西的方法。
- POST 往往是用来创建一个资源的,而 PUT 往 往是用来修改一个资源的。
DELETE:顾名思义就是用来删除资源的。
2、 若干请求头
Accept:浏览器可接受的MIME类型(内容类型)(Tomcat安装目录/conf/web.xml中查找)
Accept-Charset:告知服务器,客户端支持哪种字符集。防止传过来的是另外的字符集,从而 导致出现乱码。
Accept-Encoding:浏览器能够进行解码的数据编码方式
Accept-Language:浏览器支持的语言。
Referer:当前页面由哪个页面访问过来的。
Content-Length:请求正文的长度
Content-Type:通知服务器,请求正文的格式。例如,我们进行 POST 的请求,如果正文是 JSON,那 么我们就应该将这个值设置为 JSON。取值:application/x-www-form-urlencoded。默认值对应的是form表单的enctype属性
If-Modified-Since:通知服务器,缓存的文件的最后修改时间。如果服务器在某个时间后更新了,客户端就应该下载最新的资源。如果没有更新,服务器会返回“304 Not Modified”的响应,那客户端就不用下载了
Cache-control是用来控制缓存的。当客户端发送的请求中包含 max-age 指 令时,如果判定缓存层中,资源的缓存时间数值比指定时间的数值小,那么客户端可以接受缓存 的资源;当指定 max-age 值为 0,那么缓存层通常需要将请求转发给应用集群
User-Agent:通知服务器,浏览器类型.
Connection:表示是否需要持久连接。如果服务器看到这里的值为“Keep -Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接
Cookie:这是最重要的请求头信息之一(会话有关)
3 、空行,请求头部后面的空行是必须的
即使第四部分的请求数据为空,也必须有空行。
4 、请求实体(可以没有)
只有POST请求才有请求实体.
四、HTTP请求的发送
1、HTTP协议是基于TCP协议的,所以通过二进制流的方式发送给对方。到了对方TCP层,它会把二进制流变成一个报文段发送给服务器。
- 客户端采用连续ARQ(Automatic Repeat reQuest)协议,服务端累计确认回应ACK的方式来保证可靠传输。
- 如果服务端没有回应,那么TCP这一层会重新传输,直到可以到达。同一个包可能被传了好多次,但是HTTP层并不知道,因为是 TCP 这一层在埋头苦干。
2、TCP层发送每个报文的时候,都会将源地址和目标地址放到IP头,交给IP层进行传输
3、IP层查看通过将目标IP地址&子网掩码可以得到网络地址,以此判断目标地址是否和自己同一网段。
- 如果是,就发送ARP来请求目标地址的MAC地址,然后将源MAC和目标MAC放入MAC头,发出去即可
- 如果不是,就发送ARP来请求网关的MAC地址,然后将源MAC和网关的MAC放入MAC头,发送出去。
4、网关收到包发现MAC符合,去掉MAC头取出IP地址,根据路由协议找到下一跳的路由器,获取下一跳路由器的MAC地址,封装成帧,将包发给下一跳路由器
- 在自治系统内,用内部网关协议IGP (Interior Gateway Protocal),例如RIP或OSPF(Open Shortest Path First,开放式最短路径优先)来进行传输
- 在自治系统之间,用外部网关协议EGP (External Gatewey Protocol)进行传输
- 所谓的下一跳,看起来是IP地址,其实是要通过ARP得到MAC地址,将下一跳的MAC地址放在目标MAC地址里面。
5、就这样最后一跳的路由器发现目标地址在自己的某个出口的局域网上。于是在局域网内发送ARP,获取目标地址的MAC地址将包发出
6、目标机器发现MAC地址符合,将包收进来;发现IP地址符合,根据IP头中的协议项就知道上层是TCP协议;根据TCP头中的序列号判断这个序列包是不是我要的,如果是就放入缓存返回一个ACK,如果不是就丢弃。
7、根据TCP头里的端口号,就知道是HTTP服务器进程想要这个包。HTTP服务器的进程看到,这个请求时访问一个网页,于是将网页发给客户端。
五、HTTP 返回的构建
HTTP响应也由四个部分组成,分别是:状态行、响应头、空行和响应正文
1、状态行
1.1状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请
常见状态码:
- 200 OK //客户端请求成功
- 301 redirect // 代表永久性转移
- 302 redirect //代表暂时性转移
- 400 Bad Request //客户端请求有语法错误,不能被服务器所理解
- 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
- 403 Forbidden //服务器收到请求,但是拒绝提供服务
- 404 Not Found //请求资源不存在,eg:输入了错误的URL
- 500 Internal Server Error //服务器发生不可预期的错误
- 503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
2、若干响应头
Location:制定转发的地址。需与302/307响应码一同使用
Server:告知客户端服务器使用的容器类型
Content-Encoding:告知客户端服务器发送的数据所采用的压缩格式
Content-Length:告知客户端正文的长度
Content-Type:告知客户端返回的是 HTML,还是 JSON。例如Conent-Type:text/html;charset=UTF-8
Refresh:定期刷新。还可以刷新到其他资源。 例如Refresh:3;URL=otherurl 3秒后刷新到otherurl这个页面
Content-Disposition:指示客户端以下载的方式保存文件。
Expires:网页的有效时间。单位是毫秒(等于-1时表示页面立即过期)
Cache-Control:no-cache 例如 ragma:no-cache,控制客户端不要缓存
3、空行 ,消息报头后面的空行是必须的
4、响应正文 ,服务器返回给客户端的文本信息。
空行后面的html部分为响应正文。
六、HTTP响应
1、构造好返回的报文,将其交给Socket发送,还是到TCP层,让TCP将返回的HTML,也分成一个个小段,并且保证每个段都可到达
2、这些段假设TCP头后交给IP头,按刚才发送的过程反向走一遍。两次走的路径不一定相同,但是逻辑过程一样。
3、客户端发现 MAC 地址符合、IP 地址符合,于是就会交给 TCP 层。根据序列号看是不是自己要 的报文段,如果是,则会根据 TCP 头中的端口号,发给相应的进程。这个进程就是浏览器,浏览器作为客户端也在监听某个端口
4、浏览器拿到HTTP报文。发现返回 “200”,一切正常。解析HTML,展示出一个绚丽多彩的网页。
以上就是一个正常的 HTTP 请求和返回的完整过程。
1、get和post请求的区别
get请求 | post请求 | |
1 | 将参数放在URL后面拼接明文显示,不安全 | 参数是在请求体中,浏览器地址栏没有明文显示,安全 |
2 | 提交的数据最大2kb,取决于浏览器的限制 | 理论上没有限制 |
3 | 在浏览器回退是无害的 | 会再次提交请求 |
4 | 主动被浏览器缓存 | 不会主动,除非主动设置 |
2、cookie和session的区别
cookie:是客户端技术,服务器把每个用户的数据以cookie的形式返给浏览器。当用户再次访问时,就会携带各自的数据
session:是服务端技术 ,服务器为每个用户创建一个独享的session对象,生成JSESSIONID以cookie的形式返给浏览器。当再次访问时,就可以根据JSESSIONID去各自的session中取出数据为用户服务
session因为数据存储在服务端,所以安全