HTTP 协议运行在 TCP 之上,明文传输,客户端与服务器端都无法验证对方身份;HTTPS 是身披 SSL(Secure Socket Layer)外壳的 HTTP,运行在 SSL 上,SSL 运行于 TCP 之上,是添加了加密和认证机制的 HTTP。二者之间存在如下不同:
对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全的将密钥发给对方;而非对称加密是指使用一堆非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接受到加密信息后,使用自己的私钥进行解密。
由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。
三次握手(我要和你建立连接-你真的要和我建立连接吗-我真的要和你建立连接-成功):
四次挥手(我要和你断开连接;好的。我也要和你断开连接;好的。):
为了防止已失效的连接请求报文突然又传送到了服务器,因而产生错误。
客户端发出的连接请求报文并未丢失,而是在某个网络节点长时间滞留了,以致延误到连接释放以后的某个时间才到达Server。这时,Server误以为这是Client发出的一个新的连接请求,于是就向客户端发送确认数据包,同意建立连接。若不采用“三次握手”,那么只要Server发出确认数据包,新的链接就建立了。由于client此时并未发出建立连接请求,所以不会理睬server的确认,也不与server通信;而这时server一直在等待client的请求,这样server就白白浪费了一定的资源。若采用“三次握手”,在这种情况下,由于server端没有收到来自客户端的确认,则就会知道client并没有要求建立请求,就不会建立连接。
TCP 提供一种面向连接的、可靠的字节流服务。其中,面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信;而字节流服务意味着两个应用程序通过TCP连接交换8bit字节构成的字节流,TCP不在字节流中插入记录标识符。
对于可靠性,TCP通过以下方式进行保证:
服务器端会为每个请求创建一个连接,并向其发送确认报文,然后等待客户端进行确认。
没有彻底根治的办法,除非不适用 TCP
GET 和 POST 是我们常用的两种 HTTP Method,二者之间的区别主要包括如下五个方面:
我们知道,在 GET 请求中会对 URL 中非西文字符进行编码,这样做的目的就是为了避免歧义。
TCP 协议属于传输层协议,他们之间的区别包括:
计算机网络中的带宽、交换节点中的缓存及处理机等都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏,这种情况叫做拥塞。拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。注意,拥塞控制和流量控制不同,前者是一个全局性的过程,而后者指点对点通信量的控制。拥塞控制的方法主要有以下四种:
Cookie 和 Session 都是客户端与服务器之间保持状态的解决方案,具体来说,cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
cookie 实际上是一小段文本信息。客户端请求服务器,如果服务器需要记录用户状态,就使用response向客户端浏览器颁发一个cookie,而客户端浏览器会把cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该cookie一同提交给服务器,服务器检查该cookie,以此来辨认用户状态,服务器还可以根据需要修改cookie的内容。
同样的,会话状态也可以保存在服务器端。客户端请求服务器,如果服务器记录该用户状态,就获取session来保存状态,这时,如果服务器已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用;如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,并将这个sessionid在本次响应中返回给客户端保存。保存这个sessionid的方式可以采用cookie机制,这样在交互过程中浏览器可以自动的按照规则把这个标识发回给服务器;若浏览器禁用cookie的话,可以通过URL重写机制将sessionid传回给服务器。
Application(ServletContext):与一个 web 应用程序相对应,为应用程序提供了一个全局的状态,所有客户都可以使用该状态。
SQL 注入就是通过把 SQL 命令插入到 web 表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
使用预编译手段,绑定参数是最好的防 SQL 注入的方法。目前许多 ORM 框架及 JDBC 等都实现了SQL预编译和参数绑定功能,攻击者的恶意SQL会被当作SQL的参数而不是SQL命令被执行。在 mybatis 的 mapper 文件中,对于传递的参数我们一般是使用 # 和 $ 来获取参数值。当使用#时,变量是占位符,就是一般我们使用 javajdbc 的 prepareStatemen t时的占位符,可以防止 SQL 注入;当使用 $ 时,变量就直接追加在 SQL 中,一般会有 SQL 注入问题。
XSS 是一种经常出现在 web 应用中的计算机安全漏洞,与SQL注入一起成为web中最主流的攻击方式。XSS 是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些脚本代码嵌入到web页面中去,使别的用户访问都会执行相应的嵌入代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者尽心病毒侵害的一种攻击方式。
漏洞的产生原因是攻击者注入的数据反映在响应中。一个典型的非持久型XSS攻击包含一个带XSS攻击向量的链接(即每次攻击需要用户的点击)。
XSS 攻击向量(一般指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候执行。也就是说,每当用户使用浏览器打开指定页面时,脚本便执行。与非持久型XSS 攻击相比,持久型XSS攻击危害更大。从名字就可以了解到,持久型XSS攻击就是将攻击代码存入数据库中,然后客户端打开时就执行这些攻击代码。
漏洞产生的根本原因是太相信用户提交的数据,对用户所提交的数据过滤不足导致的,因此解决方案也应该从这个方面入手,具体方案包括:
需要注意的是,在有些应用中是允许html标签出现的,甚至是js代码出现,因此我们在过滤数据的时候需要仔细分析哪些数据是有特殊要求的(例如输出需要html代码、js代码拼接、或者此表单直接允许使用等),然后区别处理。
实现了相邻计算机节点之间比特流的透明传送,并尽可能得屏蔽掉具体传输介质和物理设备的差异,使其上层(数据链路层)不必关心网络的具体传输介质。
接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层。这一层在物理层提供的比特流的基础上,通过差错控制、流量控制方法,使有差错的物理线路变为无差错的数据链路,即提供可靠的通过物理介质传输数据的方法。
将网络地址翻译成对应的物理地址,并通过路由选择算法为分组通过通信子网选择最适当的路径。
在源端与目的端之间提供可靠的透明数据传输,使上层服务用户不必关系通信子网的实现细节。在协议栈中,传输层位于网络层之上,传输层协议为不同主机上运行的进程提供逻辑通信,而网络层协议为不同主机提供逻辑通信。
实际上,网络层可以看作是传输层的一部分,其为传输层提供服务。但对于终端系统而言,网络层对他们而言是透明的,他们知道传输层的存在,也就是说,在逻辑上它们认为是传输层为它们提供了端对端的通信。
会话层是用户应用程序和网络之间的接口,负责在网络中的两节点之间建立、维持和终止通信。
数据的编码、压缩和解压缩,数据的加密和解密
对于来自应用层的命令和数据进行解释,以确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。 7. 应用层
为用户的应用进程提供网络通信服务
网络层的ARP协议完成了IP地址与物理地址的映射。首先,每台主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。当源主机需要将一个数据包要发送到目的主机时,会首先检查自己ARP列表中是否存在该IP地址对应的MAC地址:如果有,就直接将数据包发送到这个MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。
网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一直。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARp表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个ARP响应数据包,告诉对方自己是她需要查找的MAC地址;源主机收到这个ARP响应数据包后,将得到目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
IP 地址是指互联网协议地址,是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。IP地址编址方案将IP地址空间划分为 A、B、C、D、E 五类,其中 A、B、C 是基本类,D、E 类作为多播和保留使用,为特殊地址。
每个IP地址包括两个标识码(ID),即网络ID和主机 ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上的工作站、服务器和路由器等)有一个主机ID与其对应。
A~E类地址的特点如下:
1字节的网络地址 + 3字节主机地址,网络地址的最高位必须是“0”
一个A类IP地址是指, 在IP地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码。如果用二进制表示IP地址的话,A类IP地址就由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”。A类IP地址中网络的标识长度为8位,主机标识的长度为24位,A类网络地址数量较少,有126个网络,每个网络可以容纳主机数达1600多万台。
A类IP地址的地址范围 1.0.0.0 到 127.255.255.255(二进制表示为:00000001 00000000 00000000 00000000 - 01111110 11111111 11111111 11111111),最后一个是广播地址。A类IP地址的子网掩码为 255.0.0.0,每个网络支持的最大主机数为256的3次方-2=16777214台。
2字节的网络地址 + 2字节主机地址,网络地址的最高位必须是 10
一个B类IP地址是指,在IP地址的四段号码中,前两段号码为网络号码。如果用二进制表示IP地址的话,B类IP地址就由2字节的网络地址和2字节主机地址组成,网络地址的最高位必须是“10”。B类IP地址中网络的标识长度为16位,主机标识的长度为16位,B类网络地址适用于中等规模的网络,有16384个网络,每个网络所能容纳的计算机数为6万多台。
B类IP地址地址范围128.0.0.0-191.255.255.255(二进制表示为:10000000 00000000 00000000 00000000—-10111111 11111111 11111111 11111111),最后一个是广播地址。B类IP地址的子网掩码为255.255.0.0,每个网络支持的最大主机数为256的2次方-2=65534台。
3字节的网络地址 + 1字节主机地址,网络地址的最高位必须是 110
一个C类IP地址是指,在IP地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。如果用二进制表示IP地址的话,C类IP地址就由3字节的网络地址和1字节主机地址组成,网络地址的最高位必须是 110。C类IP地址中网络的标识长度为24位,主机标识的长度为8位,C类网络地址数量较多,有209万余个网络。适用于小规模的局域网络,每个网络最多只能包含254台计算机。
C类IP地址范围 192.0.0.0-223.255.255.255(二进制表示为: 11000000 00000000 00000000 00000000 - 11011111 11111111 11111111 11111111)。C类IP地址的子网掩码为255.255.255.0,每个网络支持的最大主机数为 256-2=254 台。
多播地址,用于1对多通信,最高位必须是 1110
D类IP地址在历史上被叫做多播地址(multicast address),即组播地址。在以太网中,多播地址命名了一组应该在这个网络中应用接收到一个分组的站点。多播地址的最高位必须是“1110”,范围从224.0.0.0到239.255.255.255。
为保留地址,最高位必须是 1111
物理地址是数据链路层和物理层使用的地址,IP地址是网络层和以上各层使用的地址,是一种逻辑地址,其中 ARP 协议用于IP地址与物理地址的对应。
HTTP请求结构:请求方式+请求URL+协议及其版本
HTTP响应结构:状态码+原因短语+协议及其版本