1. 概述
HTTP是超文本传输协议,其定义了客户端与服务器端之间文本传输的规范。HTTP默认使用80端口,这个端口指的是服务端的端口,而客户端使用的端口是动态分配的。当我们没有指定端口访问时,浏览器会默认帮我们添加80端口。我们也可以自己指定访问端口如:http://www.ip138.com:80。 需要注意的是,现在大多数访问都使用了HTTPS协议,而HTTPS的默认端口为443,如果使用80端口访问HTTPS协议的服务器可能会被拒绝。
用命令 netstat -aon|findstr "进程号" 查看浏览器进程访问的网页对应IP地址所使用的端口,这里在传输层使用的都是TCP协议
2. 报文格式
(1)请求方法:
1)GET:HTTP协议中说明的GET方法是用来向服务器获取指定URL的资源的(请求报文的正文可能为空),然后服务器会将指定的资源附在应答报文的正文上返回。
2)POST:HTTP协议中说明的POST方法是用来给服务器发送某些信息的,这些信息会被存放在请求报文的正文中
3)PUT:HTTP协议中说明的PUT方法是用来给服务器上传或者更新文件的,文件存放在请求报文的正文中,URL规定了文件在服务器存放的位置
3)DELETE:删除服务器中URL指定的资源
4)OPTIONS:返回服务器支持的HTTP方法
GET与POST:
一般来说,我在浏览器输入某个域名首页进行访问的时候,使用的都是GET方法,服务器返回主页文本信息并由浏览器负责解析显示。
在提交某些数据的时候,在html的表单中提交表单的方式有"get"和“post”。
<form action="form_action.asp" method="get"
>
“get”方法提交的数据会直接填充在请求报文的URL上,如“ https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1 ” “?”问号划分域名和get提交的参数,A=B中的A是参数名,B是参数值,多个参数之间用&进行分割,如果参数值是中文,则会转换成诸如%ab%12加密16进制码。一般来说,浏览器处理的URL最大限度长度为1024B(不同浏览器不一样),所以GET方法提交参数长度有限制。
“post”方法提交的数据会附在正文上,一般请求正文的长度是没有限制的,但表单中所能处理的长度一般为100k(不同协议不同浏览器不一样),而且需要考虑下层报文的传输效率,不推荐过长。
所以GET方法可以用来传输一些可以公开的参数信息,解析也比较方便,如百度的搜索的关键词,而POST方法可以用来提交一个用户的敏感信息(如果不使用HTTPS加密,报文正文仍旧是明文,容易被人截获读取)
图片来源:http://www.w3school.com.cn/tags/att_form_method.asp
参考文章:http://blog.csdn.net/dancen/article/details/37572101
POST与PUT:
协议上推荐的PUT方法提交的应该是幂等的,而POST则可以是不幂等的。也就是说,如果用PUT方法更新的资源以后用户访问的时候都是生成副本返回而不对资源有任何修改即用户得到资源都是一样的(如博客文章)。而是POST方法更新的资源则可能是每个用户得到的都不一样(付款二维码)。但实际还是很大程度上取决服务器如何实现。
参考文章:http://www.cnblogs.com/kungfupanda/p/5525675.html
(2)状态码
100系列:只提供连接信息
200系列:请求成功信息
300系列:URL异常 -》304 movetemporarily:URL暂时移走了
400系列:客户端异常 -》403 Fobidden :服务被拒绝 -》404 Not Found :文档未被发现
500系列:服务器端异常 -》503 service unavailable:服务器暂时关闭
(3)通用报头
给出了报文的和连接有关的通用信息:
(4)请求报头:
描述了客户端的配置,表达其能够接受或处理的文档要求
(这里的encoding指的是数据压缩方式,常见有:gzip,deflate,compress)
(5)应答报头:
描述了服务器端的配置信息
(6)正文报头:
描述了跟正文相关的一些信息
(这里的encoding指的是数据压缩方式,常见有:gzip,deflate,compress)
比如下面说明了正文数据格式为text或者html,字符集为utf-8, 语言为中文(一个语言可能对应多个字符集,一个字符集对应一种编码,但由于包含可能,一种编码可以由多种字符集来解释)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta http-equiv="Content-Language" content="zh-CN">
</head>
<body>
</body>
</html>
3.无状态连接
无状态连接指的是每次HTTP请求都是全新的,对于同一个网页不断刷新,服务器每次都会认为你的请求是第一次请求,返回结果都是相同的。而对于登录操作来说,其实是你用Cookie和Session来实现记录你的登录操作的(其实我也不是很清楚,有空再继续深入一下)。这样的优点就是服务器不用为每个客户端开辟内存保存信息(数据库信息记录除外),缺点就是每次请求都需要传输响应参数。
4.持续连接
从HTTP1.1之后,所有的HTTP请求都默认保持持续连接,即Connection: keep-alive。这样,当你第一次建立其TCP连接后,之后相同的网络进程(客户端IP+端口+服务器IP+端口)可以继续使用这个TCP连接发送请求和应答,直到请求关闭或超时时才挥手断开。注意,每一个请求依旧是无状态的,但是TCP连接可以保持。比如你获取一个www..baidu.com/a.asp,里面包含了一个基本的html文件和3个图片,你需要发送四个请求才能全部获取完毕。在非持续连接下,你的每次请求都需要TCP3次握手建立,4次挥手断开来完成。持续连接下,第一次建立成功之后,接下来的请求就可以发送无需再次建立TCP连接了。一般你在浏览器中新打开一个网页,就会帮你在系统中创建多一个进程。
5. 请求流程
比如你在浏览器中输入一个域名
1)DNS服务帮你解析该域名的IP地址(DNS使用UDP协议)
2)系统帮你随机分配可用端口,TCP根据你的客户端端口,IP地址,服务器端口(默认80),3次握手建立连接
3)浏览器发送你的HTTP请求报文,TCP依次往下层封装发送
4)服务器发送HTTP响应报文
5)浏览器得到响应报文后进行解析并显示