DHCP协议
动态主机配置协议(Dynamic Host Configuration Protocal)简称DHCP,常用于<b>给主机动态地分配IP地址</b><br>DHCP提供了<b>即插即用联网的机制</b>,这种机制允许一台计算机加入新的网络和获取IP地址而不用手工参与<br>DHCP是应用层协议,<b>基于UDP</b>
DHCP采用C/S方式(只有应用层有这种工作方式)<br><ul><li>需要IP地址的主机在启动时就广播发现报文,这时该主机就称为DHCP客户</li><li>局域网上所有主机都能收到发现报文,但只有DHCP服务器才回答此发现报文</li><li>DHCP在收到发现报文后,先在其数据库中查找该计算机的配置信息,若找到,则返回找到的信息,若找不到,则从服务器的IP地址池中取一个地址分配给该计算机<br>当看到发出方IP是0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道“这个包是发过我的”,而其他计算机就可以丢弃这个包<br></li></ul><br>
DNS协议<br>
域名系统(Domain Name System, DNS)是因特网使用的命名系统,用来把人们方便记忆的具有特定含义的主机名(如www.baidu.com)转换为便于机器处理的IP地址<br>任何一个连接到因特网上的主机,都有一个唯一的层次结构名称,即域名<br>一般一个域名由三个子域组成,分别是顶级域、二级域、三级域,级别最低的域名写在最左边,级别最高的顶级域名写在最右边<br>域名系统中,每个域分别由不同的组织进行管理,每个组织都可以将它的域再分成一定数目的子域,并将这些子域委托给其他组织去管理<br>
DNS采用C/S模型,<b>基于UDP协议</b>,端口号为<b>53</b>
<br>
<b>HTTP协议</b><br>
<b>统一资源定位符<br></b>负责标识WWW(万维网)上的各种资源,并使每个资源在整个WWW的范围内具有唯一的URL<br> URL是对可以从因特网上得到的资源的位置和访问方法的一种简洁表示<br>URL<b>相当于一个文件名在网络范围的扩展</b><br>URL的一般形式是:<b><协议>://<主机>:<端口>/<路径></b><br><ul><li>常见的协议有http、ftp等</li><li>主机是存放资源的主机在因特网中的域名,也可以是IP地址</li><li>端口和路径有时可以省略</li><li>URL中不区分大小写</li></ul>
<b>HTTP协议<br></b>HTTP定义了<b>浏览器怎样向服务器请求资源</b>,以及<b>服务器怎样把资源传送给浏览器</b><br><b>HTTP规定了在浏览器和服务器之间的请求和响应的格式与规则</b>,是WWW上能够可靠地交换文件的重要基础<br>HTTP有多个版本,目前广泛使用的是HTTP/1.1版本<br>HTTP是一个应用层协议,使用<b>TCP连接</b>进行可靠的传输<b><br></b>
HTTP协议的特点<br><b>简单快速</b><br><b>灵活</b><br><b>无状态</b><br><ul><li>无状态是指服务端<b>没有存储客户端的状态、对于事务处理没有记忆</b>,后续处理需要前面的信息,则必须重传</li><li><span style="font-size: inherit;">为了弥补无状态的不足,产生了两项</span><b style="font-size: inherit;">记录HTTP状态的技术,分别是Cookie和Session<br></b></li></ul><b style="font-size: inherit;">无连接</b><b style="font-size: inherit;"><br><ul><li><b style="font-size: inherit;">无连接指的是限制每次连接只处理一个请求,服务器处理完客户端的请求并收到客户端的应答后即断开连接,无连接是为了尽快将资源释放出来给其他客户端</b></li><li><b style="font-size: inherit;">无连接对于服务器来说处比较简单,因为存在的连接都是有用的连接,不需要额外的控制,但如果客户端连接频繁,会在tcp连接的频繁建立和关闭上浪费资源</b></li><li><span style="font-size: inherit;"><b>HTTP/1.1提出持久连接(HTTP Keep-Alive),在持久连接中只要任意一端没有明确提出断开连接,则保持TCP连接状态,在请求首部字段中的Connection: keep-alive表明使用了持久连接</b></span></li></ul></b><b style="font-size: inherit;"><br><br></b><b style="font-size: inherit;"></b><b>Cookie和Session结合进行HTTP状态存储</b><br><ul><li>Cookie是客户端的解决方案,由服务器发给客户端的特殊信息会以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息</li><li>Session是服务器端使用的一种记录客户端状态或信息的机制</li><li>通过Cookie存储一个session_id,然后具体的数据则保存在Session中</li><li>如果用户已经登录,则客户端会在Cookie中保存一个session_id,下次再次请求的时候会把该session_id携带上来,服务器根据session_id在Session库中获取用户的session数据,就能知道该用户到底是谁,以及之前保存的一些状态信息;</li></ul>
<b>访问一个URL时所发送的事情</b><br>以访问http://www.tsinghua.edu.cn/chn/index.htm为例<br> a. 浏览器分析URL<br> b. 浏览器向DNS域名服务器请求解析www.tsinghua.edu.cn的IP地址<br> c. 域名系统DNS解析出清华大学服务器的IP地址<br> d. 浏览器与清华大学服务器建立TCP链接<br> e. 浏览器发出HTTP请求:GET /chn/index.htm<br> f. 服务器通过HTTP响应把文件index.htm发送给浏览器<br> g. TCP链接释放<br> h. 浏览器解释index.htm文件,并将Web页面显示给用户
<b>HTTP报文概述</b><br> ○ HTTP报文是<b>面向文本</b>的,报文中的<b>每一个字段都是一些ASCII码串</b>,各个字段的长度是不确定的。<br> ○ HTTP有两类报文,请求报文(从Web客户端向Web服务器发送服务请求)和响应报文(从Web服务器对Web客户端请求的回答)<br>
<b>HTTP请求报文</b><br>一个HTTP请求报文由请求行、请求头部、空行和请求体4个部分组成<br>1. <b>请求行(Request Line)</b><br>请求行由<b>请求方法</b>字段、<b>URL字段</b>和<b>HTTP协议版本</b>字段3个字段组成,它们用空格分隔,例如GET /index.html HTTP/1.1<br><b>常见的请求方法有GET、POST、HEAD</b><br><b>a. GET</b><br><ul><li>GET是最常见的一种请求方式,当客户端要从服务器中读取文档、点击网页上的链接、通过在浏览器的地址栏输入网址来浏览网页时,使用的都是GET方式</li><li>GET方式要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,<b>请求参数和对应的值附加在URL后面</b>(因此参数在请求行中),利用?代表URL的结尾与请求参数的开始,利用&分隔多个参数。</li><li>利用GET方式传参时,参数的值可以直接在URL中看到。显然,<b>GET方式不适合传送私密数据</b></li><li>另外,不同的浏览器对URL的字符限制也有所不同,一般最多只能识别1024个字符,所以<b>如果需要传送大量数据的时候,也不适合使用GET方式</b></li></ul><b>b. POST</b><br><ul><li>对于上面提到的不适合使用GET方式的情况,可以考虑使用POST方式</li><li><b>POST方法将请求参数封装在HTTP请求体中</b>,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中</li><li><b>GET多用来查询</b>,请求参数放在URL中,不会对服务器上的内容产生作用;<b>POST多用来提交</b>,如把表单内容放到Request Body中</li></ul><b>c. HEAD</b><br> ○ HEAD类似于GET,不同的是<b>服务端接受到HEAD请求后只返回响应头,而不会发送响应内容</b><br> ○ 当我们只需要查看某个页面的状态的时候,使用HEAD非常高效,因为在传输的过程中省去了页面内容<br><br><b>2. 请求头(Request Header)</b><br>请求头由<b>关键字/值对</b>组成,每行一对,关键字和值用英文冒号:分隔<br>请求头部通知服务器关于客户端请求的信息,典型的请求头有<br><ul><li><span style="font-size: inherit;">User-Agent:产生请求的浏览器类型</span></li><li><span style="font-size: inherit;">Host:请求的服务器套接字(1.1以后才有)</span></li><li><span style="font-size: inherit;">Content-Length:Request Body中数据的长度</span></li><li><span style="font-size: inherit;">Content-Type:指定Request Body中数据的编码类型(如application/json),服务器根据该类型使用特定的解析方式解析请求体</span></li><li><span style="font-size: inherit;">Connection:指定是否是HTTP持久连接(即Keep-Alive)</span></li></ul><span style="font-size: inherit;"></span><br><b>3. 请求体(Request Body)</b><br><ul><li>请求体不在GET方法中使用,而是在POST方法中使用,POST方法会将客户端要传送的数据封装在请求体中</li><li>与请求体相关的最常使用的请求头是<b>Content-Type</b>(如json)和<b>Content-Length</b></li></ul><br>
<b>HTTP响应报文<br></b>响应报文也由三个部分组成,分别是:状态行、响应头、响应体<br>响应报文的格式与各部分功能与请求报文基本一致,<b>真正的区别在于第一行中用状态行代替了请求行</b><br><br><b>状态行(Status Line)</b><br>状态行通过提供一个<b>状态码</b>和<b>状态码描述</b>来<b>说明所请求的资源情况</b><br><br>状态码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值<br><ul><li><span style="font-size: inherit;">1xx:指示信息--表示请求已接收,继续处理</span></li><li><b><span style="font-size: inherit;">2xx:</span><span style="font-size: inherit;">成功</span></b><span style="font-size: inherit;">--表示请求已被成功接收、理解、接受</span></li><li><span style="font-size: inherit;">3xx:重定向--要完成请求必须进行更进一步的操作</span></li><li><b><span style="font-size: inherit;">4xx:</span><span style="font-size: inherit;">客户端错误</span></b><span style="font-size: inherit;">--请求有语法错误或请求无法实现</span></li><li><span style="font-size: inherit;"><b>5xx:</b></span><b style="font-size: inherit;">服务器端错误</b><span style="font-size: inherit;">--服务器未能实现合法的请求</span></li></ul><b>常见状态代码及状态码描述</b><br><ul><li><b>200 OK</b>:客户端请求成功。</li><li><b>400 Bad Request</b>:客户端请求有语法错误,不能被服务器所理解。</li><li><b>401 Unauthorized</b>:请求未经授权</li><li><b>403 Forbidden</b>:服务器收到请求,但是拒绝提供服务。</li><li><b>404 Not Found</b>:<b><font color="#ff0000">请求资源不存在</font></b>,举个例子:输入了错误的URL。</li><li><b>500 Internal Server Error</b>:服务器发生不可预期的错误。</li><li><b>503 Server Unavailable</b>:服务器当前不能处理客户端的请求,一段时间后可能恢复正常</li></ul>
<b>HTTPS协议</b>
<b>HTTP协议的问题</b><br><ul><li><span style="font-size: inherit;">请求信息明文传输,容易被窃听截取</span></li><li><span style="font-size: inherit;">数据的完整性未校验,容易被篡改</span></li><li><span style="font-size: inherit;">没有验证对方身份,存在冒充危险|</span></li></ul><br><b>HTTPS(HyperText Transfer Protocol over Secure Socket Layer)协议</b><br>为了解决上述HTTP存在的问题,就出现了HTTPS协议,HTTPS在HTTP的基础上通过<b><font color="#ff0000">传输加密</font></b>和<b><font color="#ff0000">身份认证</font></b>保证了传输过程的安全性<br>HTTPS协议一般理解为HTTP+SSL/TLS,SSL是HTTPS安全的基础,所有加密的操作都由SSL完成,可以<b>将SSL理解为HTTP与TCP之间的加密/身份验证层</b><br style="font-size: inherit;">
<b>SSL(Secure Socket Layer)协议</b><br>SSL协议通过<b>数字证书</b>、<b>非对称密钥技术</b>和<b>对称密钥技术</b>来完成加密传输与身份认证<br><b><font color="#ff0000">对称加密算法加密数据 + 非对称加密算法交换密钥 + 数字证书验证身份 = 安全</font></b><br><br><b>SSL加密过程(HTTPS工作过程)</b><br><ol style=""><li style="">客户端向服务端发起请求</li><li style="">服务端将其<b>SSL证书发送给客户端</b>,<b>证书中包含服务器的公钥</b>,而服务器自己持有该公钥对应的私钥(可以把公钥和私钥想象成一把钥匙和一个锁头,世界上只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。)</li><li style="">客户端对服务器的证书进行验证,并取出服务器的公钥;然后,客户端再产生一个称作<b>pre_master_secret的随机密码串(实际上是对称加密的密钥)</b>,并<b>使用服务器的公用密钥对其进行加密</b>(参考非对称加 / 解密),并<b>将加密后的信息发送给服务器</b>;<br>服务器收到后,用私钥进行解密,得到客户端传来的随机值,也就是对称加密的密钥,然后通过该密钥对将要传送的数据进行对称加密,然后发送给客户端</li><li style="">客户端根据自己的对称加密密钥解密信息</li></ol><br>
<b>HTTPS的缺点</b><br><ul><li>相同网络环境下,HTTPS协议会<b>使页面的加载时间延长近50%</b>。此外,HTTPS 协议还会影响缓存,增加数据开销和功耗。</li><li>HTTPS协议的安全是有范围的,<b>在黑客攻击、拒绝服务攻击和服务器劫持等方面几乎起不到什么作用</b>。</li><li>最关键的是,<b>SSL证书的信用链体系并不安全</b>。</li><li>服务器成本增加。因为HTTPS协议的工作要增加额外的计算资源消耗,在大规模用户访问应用的场景下,<b>服务器需要频繁地做加密和解密操作,几乎每一个字节都需要做加解密,这就产生了服务器成本</b>。随着云计算技术的发展,数据中心部署的服务器使用成本在规模增加后逐步下降,相对于用户访问的安全提升,其投入成本已经下降到可接受程度。</li></ul>