Fork me on GitHub

读《图解HTTP》笔记

因为最近在写网络爬虫程序,需要对HTTP协议方面的知识有足够详细的了解。所以最近阅读了下《图解HTTP》。以下是读书笔记。

1.了解Web及网络基础

当我们在浏览器中输入URL时,Web页面如何显示?它是根据地址栏中的URL,从Web服务器端获取文件资源等信息,从而显示出Web页面。

客户端:即通过发送请求获取服务器资源的Web浏览器等,都可称为客户端。

Web使用一种名为HTTP(HyperText Transfer Protocol,超文本传输协议)的协议来作为规范,完成从客户端到服务端的一系列运作流程。

TCP/IP协议族:计算机和网络设备要相互通信,双方就必须基于相同的方法。如如何探测通信目标,由哪边发起通信,怎样结束通信等规则都要事先确定。不同的硬件,操作系统之间的通信,这一切都需要一种规则。我们把这种规则称为协议。我们把与互联网相关联的协议集合总称为TCP/IP。

TCP/IP协议族按层次分为:应用层、传输层、网络层、数据链路层。

应用层:决定了向用户提供应用服务时通信的活动。如FTP(File Transfer Protocol,文件传输协议),DNS(Domain Name System,域名系统)。HTTP协议也位于该层。

传输层:对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。分为TCP(Transmission Control Protocol,传输控制协议),UDP(User Data Protocol,用户数据报协议)。

网络层:网络层用来处理网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传给对方。

数据链路层:用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分。硬件的范畴均在链路层的作用范围内。

利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收端则往应用层走。

下面以HTTP请求为例来说明。

首先作为发送端的客户端在应用层(HTTP协议)发出想访问某个Web页面的HTTP请求。

接着,为了传输方便,在传输层(TCP协议)把从应用层收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。

在网络层(IP协议),增加作为通信为目的地的MAC地址后转发给链路层。这样发往网络的通信请求就准备好了。

接收端的服务器在链路层接受到数据,按序往上层发送,一直到应用层。当传输到应用层,才是真正接收到由客户端发送过来的HTTP请求。

发送端在层与层传输数据时,每经过一层时会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层会把对应的首部消去。

与HTTP关系密切的协议:IP,TCP,DNS

负责传输的IP协议

IP协议的作用是把各种数据包传送给对方。而要保证传送到对方那里,则要满足各类条件。两个重要的条件是IP地址MAC地址

IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可变换,MAC地址基本不会更改。

使用ARP凭借MAC地址进行通信

IP间的通信依赖MAC地址。在网络上,通信双方位于同一局域网(LAN,local area network)的情况很少,通常经多台计算机和网络设备才能连接到对方。而在进行中转时,会利用下一站的中转设备的MAC地址来搜索下一个中转目标。这时会采用ARP(Address Resolution Protocol,地址解析协议),他根据对方的IP就可以查出对应的MAC地址。

确保可靠性的TCP协议

按层次分,TCP位于传输层,提供可靠的字节流服务。

字节流服务即将大块的数据分割成以报文段为单位的数据包进行管理。

三次握手

TCP的标志:SYN(synchronize)、ACK(acknowledgement)。

发送端会发送一个带SYN标志的数据包给接收端,接收端收到后会回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后,发送端再回传一个带ACK标志的数据包,表示“握手”结束。

四次挥手

为什么断开要4次呢,第一次客户端会发送一个

负责域名解析的DNS服务

DNS是和HTTP协议一样位于应用层,用来提供域名到IP地址的解析。

2.简单的HTTP协议

GET:获取资源PUT:传输实体主体PUT:传输文件DELETE:删除文件

Http返回状态码:

类别 原因短句
1xx Informational(信息性状态码) 接收的请求正在处理
2xx Success(成功状态码) 请求正常处理完毕
3xx Redirection(重定向状态码) 需要进行附加操作以完成请求
4xx Client Error(客户端错误状态码) 服务器无法处理请求
5xx Server Error(服务端错误状态码) 服务器处理请求出错

3XX重定向

3XX响应结果表示浏览器需要执行某些特殊的处理以正确处理请求。

301:永久性重定向,表示请求的资源已经被分配到新的URI,以后应该使用资源现在所指的URI。也就是说,如果已经把对应的URI保存书签了,这时应该按照Location首部字段提示的URI重新保存。

302:临时性重定向,表示请求的资源已经被分配到新的URI,希望用户本次能使用新的URI进行访问。

303:表示由于请求对应的资源存在着另一个URI,应使用GET方法进行重定向获取请求的资源。

304:表示客户端发送附带的请求条件时,服务器端允许请求访问资源,但未满足条件的情况。304返回时,不包含任何响应的主体部分。304虽然被划为3XX类别中,但和重定向无关。

4XX客户端发生错误

400:表示请求报文中存在语法错误,需要修改请求内容后再次发送请求。

401:表示发送的请求需要通过HTTP认证的认证信息。如之前已进行过一次请求,则表示用户认证失败。

403:表示请求资源的访问被服务器拒绝了。

404:表示服务器无法找到请求的资源。

5XX服务器错误

500:服务端在请求时发生错误。

503:服务端暂时处于超负载或正在进行停机维护。

3.确保Web安全的HTTPS

HTTP的缺点

  • 通信使用明文(不加密),内容可能会被窃听。
  • 不验证通信方的身份,因此可能遭遇伪装。
  • 无法证明报文的完整性,可能已遭篡改。

HTTP协议中没有加密机制,但可以通过和SSL(Secure Socket Layer,安全套接层)或TLS(Transport Layer Security,安全层传输协议)的组合使用,加密HTTP的通信内容。

和SSL组合使用的HTTP被称为HTTPS(HTTP Secure,超文本传输安全协议)。

HTTPS需要解决上述HTTP的问题,需要实现以下三点

  • 客户端和服务器直接的通信只有自己能看懂,即使第三方拿到数据也看不懂这些信息的真实含义。
  • 客户端必须避免中间人攻击,即除了真正的服务器,任何第三方都无法冒充服务器。
  • 第三方虽然看不懂数据,但可以 XJB 改,因此客户端和服务器必须有能力判断数据是否被修改过。

采用对称加密来加密需要传递的信息。

采用非对称加密来传递对称密钥。