1、网络请求
1.1 网络通讯三要素
1、IP 地址(主机名):
网络中设备的唯一标示。不易记忆,可以用主机名(域名)。
1) IP V4:
- 0~255.0~255.0~255.0~255 ,共有 2^8^4 = 2^32 = 42 亿。
2) 本地回环地址:
每台机器都有自己的本地回环地址,ip 为 127.0.0.1 ,主机名为 localhost。如果 127.0.0.1 ping 不通,则网卡不正常。
本地 hosts 文件修改,终端:
$ cd /etc
$ sudo vim hosts
$ 输入密码进入 hosts 文件编辑界面
$ 将光标移动到指定位置
- 英文输入模式下按 i 键进入编辑状态,
- 英文输入模式下按 esc 键进入命令状态,
- 在命令状态下输入 :wq 回车,保存退出 hosts 文件。
2、端口号:
- 用于标示进程的逻辑地址,不同进程的标示。
有效端口为 0 ~ 65535,其中 0 ~ 1024 由系统使用或者保留端口,开发中不要使用 1024 以下的端口。
1) Netcat 的使用:
- Netcat 是 Mac 终端下用于调试和检查网络的工具包,可用于创建 TCP/IP 连接。
- 终端:
$ nc -lk 12345
,开启监听,终端将始终监听本地计算机 12345 端口的数据。
3、传输协议(通讯的规则):
1) TCP:传输控制协议:
- 建立连接,形成传输数据的通道(建立连接的三次握手,断开连接的四次握手)。
- 在连接中进行大数据传输,数据大小不收限制。
- 通过三次握手完成连接,是可靠协议,数据安全送达。
- 必须建立连接,效率会稍低。
2) UDP:用户数据报协议:
- 只管发送,不确认对方是否接收到。
- 不需要建立连接,将数据及源和目的封装成数据包中,每个数据报的大小限制在 64K 之内。
- 因为无需连接,因此是不可靠协议。
- 不需要建立连接,速度快。
- 应用场景:多媒体教室/网络流媒体。
3) 常见网络协议:
应用层协议 | 端口 | 说明
-----------------|----------------|---------------------------------
HTTP | 80 | 超文本传输协议
HTTPS | 443 | HTTP+SSL,HTTP 的安全版
FTP | 20, 21, 990 | 文件传输
POP3 | 110 | 邮局协议
SMTP | 25 | 简单邮件传输协议
telnet | 23 | 远程终端协议
1.2 网络参考模型
ISO 参考模型 | TCP/IP 参考 | 说明 |
---|---|---|
应用层 | 应用层 | FTP,HTTP,TELNET,SMTP,DNS 等协议 |
表示层 | ||
会话层 | ||
传输层 | 传输层 | Socket 开发,TCP 协议,UDP 协议 |
网络层 | 网络互连层 | 路由器,IP 协议,ICMP 协议,ARP 协议,RARP 协议和 BOOTP 协议 |
数据链路层 | 网络接口层 | 交换机 |
物理层 | 网线 |
1.3 HTTP 请求
- HTTP(HyperText Transfer Protocol 超文本传输协议)是一套计算机通过网络进行通信的规则。计算机专家设计出 HTTP,使 HTTP 客户(如 Web 浏览器)能够从 HTTP 服务器(Web 服务器)请求信息和服务。HTTP 是一种无状态的协议,无状态是指 Web 浏览器和 Web 服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后 Web 服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息。HTTP 遵循请求(Request)/应答(Response)模型。Web 浏览器向 Web 服务器发送请求,Web 服务器处理请求并返回适当的应答。所有 HTTP 连接都被构造成一套请求和应答。
1.3.1 HTTP 通信机制
HTTP 通信机制是在一次完整的 HTTP 通信过程中,Web 浏览器与 Web 服务器之间将完成下列 7 个步骤:
1、建立 TCP 连接
- 在 HTTP 工作开始之前,Web 浏览器首先要通过网络与 Web 服务器建立连接,该连接是通过 TCP 来完成的,该协议与 IP 协议共同构建 Internet,即著名的 TCP/IP 协议族,因此Internet 又被称作是 TCP/IP 网络。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更层协议的连接,因此,首先要建立 TCP 连接,一般 TCP 连接的端口号是 80。
2、Web 浏览器向 Web 服务器发送请求命令
- 一旦建立了 TCP 连接,Web 浏览器就会向 Web 服务器发送请求命令。例如:GET /sample/hello.jsp HTTP/1.1
3、Web 浏览器发送请求头信息
- 浏览器发送其请求命令之后,还要以头信息的形式向 Web 服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。
4、Web 服务器应答
- 客户机向服务器发出请求后,服务器会给客户机回送应答,HTTP/1.1 200 OK,应答的第一部分是协议的版本号和应答状态码。
5、Web 服务器发送应答头信息
- 正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
6、Web 服务器向浏览器发送数据
- Web 服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 应答头信息所描述的格式发送用户所请求的实际数据。
7、Web 服务器关闭 TCP 连接
- 一般情况下,一旦 Web 服务器向浏览器发送了请求数据,它就要关闭 TCP 连接,然后如果浏览器或者服务器在其头信息加入了这行代码,Connection:keep-alive,TCP 连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
1.3.2 HTTP 请求格式
当浏览器向 Web 服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP 请求信息由 3 部分组成:
- 请求行:请求方法 请求路径 协议/版本
- 请求头
请求体
如:
GET /videos.jsp HTTP/1.1 // 请求行 Host: localhost // 请求头 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:36.0) Gecko/20100101 Firefox/36.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,* / *;q=0.8 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7 Connection: keep-alive username=jinqiao&password=1234 // 请求体
1、请求行:
请求的第一行,其组成为:请求方法 请求路径 协议/版本
请求行 :GET /videos.jsp HTTP/1.1
- 请求方法 :GET
- 请求路径 :/videos.jsp
协议/版本:HTTP/1.1
(1) 请求方法:
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。例如:HTTP1.1 支持 7 种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE 和 TARCE。在 Internet 应用中,最常用的方法是 GET 和 POST。
GET 方法:
GET 方法是默认的 HTTP 请求方法,通过请求 URL 得到资源。我们日常用 GET 方法来提交表单数据,然而用 GET 方法提交的表单数据只经过了简单的编码,同时它将作为 URL 的一部分向 Web 服务器发送,因此,如果使用 GET 方法来提交表单数据就存在着安全隐患上。例如:
Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB
从上面的 URL 请求中,很容易就可以辩认出表单提交的内容。(?之后的内容)另外由于 GET 方法提交的数据是作为 URL 请求的一部分所以提交的数据量不能太大。
POST 方法:
POST 方法是 GET 方法的一个替代方法,用于添加新的内容。它主要是向 Web 服务器提交表单数据,尤其是大批量的数据。POST 方法克服了 GET 方法的一些缺点。通过 POST 方法提交表单数据时,数据不是作为 URL 请求的一部分而是作为标准数据传送给 Web 服务器,这就克服了 GET 方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用 POST 方法。
从编程的角度来讲,如果用户通过 GET 方法提交数据,则数据存放在 QUERY_STRING 环境变量中,而 POST 方法提交的数据则可以从标准输入流中获取。
- DELETE:删除某个内容
- CONNECT:用于代理进行传输,如使用 SSL
- OPTIONS:询问可以执行哪些方法
- PATCH:部分文档更改
- PROPFIND, (wedav):查看属性
- PROPPATCH, (wedav):设置属性
- MKCOL, (wedav):创建集合(文件夹)
- COPY, (wedav):拷贝
- MOVE, (wedav):移动
- LOCK, (wedav):加锁
- UNLOCK (wedav):解锁
- TRACE:用于远程诊断服务器
- PUT :改
HEAD:类似于 GET, 只返回响应,不返回实体数据,用于检查对象是否存在,以及得到对象的元数据,下载数据前使用
apache2 中,可使用 Limit,LimitExcept 进行访问控制的方法包括:GET, POST, PUT, DELETE, CONNECT,OPTIONS, PATCH, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE,LOCK, 和 UNLOCK。其中, HEAD GET POST OPTIONS PROPFIND 是和读取相关的方法,MKCOL PUT DELETE LOCK UNLOCK COPY MOVE PROPPATCH 是和修改相关的方法。
(2) 请求路径:
- 请求路径(URI) 完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以 “/” 开头,最后,协议版本声明了通信过程中使用 HTTP 的版本。
(3) 协议/版本:
- HTTP/1.1
2、请求头:
请求头包含许多有关客户端环境和请求体的有用信息。例如,请求头可以声明浏览器所用的语言,请求体的长度等。当我们打开一个网页时,浏览器要向网站服务器发送一个 HTTP 请求头,然后网站服务器根据 HTTP 请求头的内容生成当次请求的内容发送给浏览器。
Host: localhost // 请求主机 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:36.0) Gecko/20100101 Firefox/36.0 // 告诉服务器客户端的类型 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 // 告诉服务器客户端支持的格式 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 // 告诉服务器客户端的语言 Accept-Encoding: gzip, deflate // 告诉服务器客户端支持的压缩格式 Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7 // 告诉服务器客户端字符编码 Connection: keep-alive // 告诉服务器连接类型 Content-Length: 4817 // 提交给服务器的内容长度 Content-Type: text/html // 提交给服务器的内容类型 Authorization: authorString // 访问服务器的验证信息 Range: bytes=0-499 // 指定要返回的数据范围
(1) Host
表示请求的服务器网址。请求报头域主要用于指定被请求资源的 Internet 主机和端口号,它通常从 HTTP URL 中提取出来的。
例如: 我们在浏览器中输入:
http://www.guet.edu.cn/index.html
,浏览器发送的请求消息中,就会包含 Host 请求报头域,如下:Host:http://www.guet.edu.cn
,此处使用缺省端口号 80,若指定了端口号,则变成:Host:指定端口号
。
(2) User-Agent
告诉 HTTP 服务器,客户端使用的操作系统和浏览器的名称和版本。
User-Agent(用户代理),简称 UA,它是一个特殊字符串头,使得服务器能够识别客户端使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
例如:
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)
(3) Accept
告诉服务器浏览器端可以接受的媒体类型。
客户端支持的 MIME 类型分别是 text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8,优先顺序是它们从左到右的排列顺序。
text/html,application/xhtml+xml,application/xml 都是 MIME 类型,也可以称为媒体类型和内容类型,斜杠前面的是 type(类型),斜杠后面的是 subtype(子类型);type 指定大的范围,subtype 是 type 中范围更明确的类型,即大类中的小类。
- text :用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
text/html :表示 html 文档;
- application :用于传输应用程序数据或者二进制数据;
- application/xhtml+xml :表示 xhtml 文档;
application/xml :表示 xml 文档。
- q 是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于获得其 “;” 之前的类型表示的内容。
- 若没有指定 q 值,则默认为 1。
- 若被赋值为 0,则用于提醒服务器哪些是浏览器不接受的内容类型。
(4) Accept-Language
告诉服务器浏览器申明自己接收的语言。
语言跟字符集的区别:中文是语言,中文有多种字符集,比如 big5,gb2312,gbk 等等;
例如:
Accept-Language: en-us
- zh-cn :表示简体中文
zh :表示中文
(5) Accept-Encoding
浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码);
例如:
Accept-Encoding: gzip, deflate
- gzip :是 GNU zip 的缩写,它是一个 GNU 自由软件的文件压缩程序,也经常用来表示 gzip 这种文件格式
deflate :是同时使用了 LZ77 算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法
(6) Accept-Charset
浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如 gb2312,utf-8(通常我们说Charset包括了相应的字符编码方案);
- GB2312 :是中国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,又称 GB0,由中国国家标准总局发布,1981年5月1日实施
- utf-8 :是 Unicode 的一种变长字符编码又称万国码,由 Ken Thompson 于 1992 年创建,现在已经标准化为 RFC 3629
* :表示任意字符编码,虽然 q 都是等于 0.7,但明确指定的 GB2312,utf-8 比 * 具有更高的优先级
(7) Connection
告诉服务器连接类型。
Connection:Keep-Alive :表示持久连接,长连接。当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
Connection:close :代表一个 Request 完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接会关闭,当客户端再次发送 Request,需要重新建立 TCP 连接。
长连接:连上服务器就不断开。双方传递数据,不需要再次建立连接。
- 优点:效率高,通常只有非常有钱的公司,才会提供长连接的服务。比如:apple 的消息推送服务就是长连接。
- 缺点:用户体验不好,而且服务器的负担很重。
短连接:连上服务器,获取完数据,就立即断开。HTTP 访问,都是短连接,使用情况非常多。
(8) Content-Length
发送给HTTP服务器数据的长度。
例如: Content-Length:38
(9) Content-Type
提交给服务器的内容类型
例如:
Content-Type: application/x-www-form-urlencoded
(10) Authorization
- 访问服务器的验证信息
(11) Range
指定要返回的数据范围
- :用于分隔,前面的数字表示起始字节数,后面的数组表示截止字节数,没有表示到末尾。
- 如:bytes=0-499 从 0 到 499 的头 500 个字节,bytes=500- 从 500 字节以后的所有字节
, :用于分组,可以一次指定多个 Range,不过很少用。
- 如:bytes=500-599,800-899 同时指定几个范围
(12) Referer
提供了 Request 的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从 HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
例如:
Referer:http://translate.google.cn/?hl=zh-cn&tab=wT
(13) Pragma
防止页面被缓存,在 HTTP/1.1 版本中,它和 Cache-Control:no-cache 作用一模一样,Pargma 只有一个用法,
例如:Pragma:no-cache
(14) Cookie
- 最重要的 header, 将 cookie 的值发送给 HTTP 服务器。
3、请求体:
请求头和请求体之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求体。请求