一.基本概念
网络指三网:电信网络、有线电视网络、计算机网络。
计算机网络向用户提供的最重要的功能有两个:连通性和共享。
网络由若干个结点和连接这些结点的链路组成。
网络把许多计算机连在一起,而因特网把许多网络连在一起。
因特网的组成:边缘部分和核心部分。
端系统之间的通信方式:客户服务器方式和对等连接方式。
电路交换:必须经过“建立连接(占用通信资源)、通话(一直占用通信资源)、释放连接(归还通信资源)”三个步骤的交换方式称为电路交换。
分组交换采用存储转发技术。把要发送的整块数据称为一个报文,在发送报文前,先把较长的报文划分为一个个更小的等长数据段,在每一个数据段前面加上一些必要的控制信息组成的首部后,就构成了一个分组。分组又称为“包”,而分组的首部称为包头。
电路交换:整个报文的比特流连续的从源点直达终点,好像在一个管道中传送。
报文交换:整个报文先传送到相邻结点,全部存储下来后查找转发表,转发到下一个结点。
分组交换:单个分组(这只是整个报文的一部分)传送到相邻结点,存储下来后查找转发表,转发到下一个结点。
计算机网络体系结构:
OSI 7层
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
每一层的协议如下:
物理层:RJ45、CLOCK、IEEE802.3 (中继器,集线器)
数据链路:PPP、FR、HDLC、VLAN、MAC (网桥,交换机)
网络层:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器)
传输层:TCP、UDP、SPX
会话层:NFS、SQL、NETBIOS、RPC
表示层:JPEG、MPEG、ASII
应用层:FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS
每一层的作用如下:
物理层:通过媒介传输比特,确定机械及电气规范(比特Bit)
数据链路层:将比特组装成帧和点到点的传递(帧Frame)
网络层:负责数据包从源到宿的传递和网际互连(包PackeT)
传输层:提供端到端的可靠报文传递和错误恢复(段Segment)
会话层:建立、管理和终止会话(会话协议数据单元SPDU)
表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)
应用层:允许访问OSI环境的手段(应用协议数据单元APDU)
TCP/IP 4层
网络接口层、 网际层、运输层、 应用层。
5层协议
物理层(传输Bit,光纤)、数据链路层(传输帧,交换机)、网络层(传输包,路由器)、运输层(传输报文)、 应用层。
应用层:通过应用进程间的交互来完成特定网络应用。(交互的是报文)
运输层:负责向两个主机中进程之间的通信提供通用的数据传输服务。(TCP-报文段、UDP-用户数据报)
网络层:负责为分组交换网上的不同主机提供通信服务、选择合适路由。(分组或packet包)
数据链路层:将网络层交下来的IP数据报组装成帧,在两个相邻节点间的链路上传送帧。
物理层:通过媒介传输比特,确定机械及电气规范。
二.物理层
物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体。
三.数据链路层
数据链路层使用的信道主要有以下两种类型:
- 点对点信道:使用一对一的点对点通信方式。
- 广播信道:使用一对多的广播通信方式。
点对点信道的数据链路层在进行通信时的主要步骤:
- 接点A的数据链路层把网络交下来的IP数据报添加首部和尾部封装成帧。
- 结点A把封装好的帧发送给结点B的数据链路层
- 若结点B的数据链路层收到的帧无差错,则从收到的帧中提取出IP数据报上交给上面的网络层;否则丢弃这个帧。
三个基本问题:
封装成帧:在一段数据的前后分别添加首部和尾部,就构成了一个帧。
透明传输:当传送的帧是用文本文件组成的帧时(文本文件中的字符都是从键盘上输入的),其数据部分显然不会出现像SOH和EOT这样的帧定界控制控制字符。可见不管从键盘上输入什么字符都可以放在这样的帧中传输过去,因此这样的传输就是透明传输。但当数据部分是非ASCII码的文本文件时(如二进制代码的计算机程序或图像),如果数据中的某个字节的二进制代码恰好和SOH和EOT这种控制字符一样,数据链路层就会错误的找到帧的定界,用字节填充法解决透明传输的问题。
差错检测:循环冗余检验CRC
CSMA/CD:载波接听多点接入/碰撞检测
多点接入:说明这是总线型网络,许多计算机以多点接入的方式连接在一根总线上。
载波接听:用电子检测技术检测总线上有没有其他计算机也在发送。
碰撞检测:边发送边监听, 即适配器边发送数据边检测信道上的信号电压的变化情况,以便判断自己在发送数据时其他站也在是否发送数据。
四.网络层
- 物理层使用的中间设备叫做转发器。
- 数据链路层使用的中间设备叫做网桥或桥接器。
- 网络层使用的中间设备叫做路由器。
- 在网络层以上使用的中间设备叫做网关。
IP地址分类:
A类地址以0开头,第一个字节作为网络号,地址范围为:0.0.0.0~127.255.255.255;
B类地址以10开头,前两个字节作为网络号,地址范围是:128.0.0.0~191.255.255.255;
C类地址以110开头,前三个字节作为网络号,地址范围是:192.0.0.0~223.255.255.255。
D类地址以1110开头,地址范围是224.0.0.0~239.255.255.255,D类地址作为组播地址(一对多的通信);
E类地址以1111开头,地址范围是240.0.0.0~255.255.255.255,E类地址为保留地址,供以后使用。
地址解析协议ARP:
每一个主机都设有一个ARP高速缓存,里面有本局域网上的各主机和路由器的IP地址到硬件地址的映射表。
当主机A要向本局域网上的某个主机B发送IP数据报时,就先在其ARP高速缓存中查看有无主机B的IP地址。如有,查出其对应的硬件地址,再把这个硬件地址写入MAC帧,然后通过局域网把该MAC帧发往此硬件地址。如没有,ARP进程在本局域网上广播发送一个ARP请求分组。在本局域网上的所有主机上运行的ARP进程都收到此ARP请求分组。主机B的IP地址与ARP请求分组中要查询的IP地址一致,就收下这个ARP请求分组,并向主机A发送ARP响应分组,并在这个ARP响应分组中写入自己的硬件地址。由于其余的所有主机的IP地址都与ARP请求分组中要查询的IP地址不一致,因此都不理睬这个ARP请求分组。
主机A收到主机B的ARP响应分组后,就在其ARP高速缓存中写入主机B的IP地址到硬件地址的映射。
分组转发算法:
- 从数据报的首部提取目的主机的IP地址D,得出目的网络地址为N。
- 若N就是与此路由器直接相连的某个网络地址,则进行直接交付,不需要在经过其他的路由器,直接把数据报交付目的主机;否则就是间接交付,执行3
- 若路由表中有目的地址为D的的特定主机路由,则把数据报传送给路由表中的所指明的下一跳路由器;否则,执行4
- 若路由表中有到达网络N的路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行5。
- 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则执行6。
- 报告转发分组出错。
内部网关协议RIP
RIP叫作路由信息协议,是一种分布式的基于距离向量的路由选择协议,要求每一个路由器都要维护从它自己到其他每一个目的网络的距离记录。从一路由器到直接连接的网络的距离定义为1.从一路由器到非直接连接网络的距离定义为所经过的路由器数加1.RIP协议的特点:仅和路由器交换信息,路由器交换的信息是当前本路由器所知道的全部信息,即自己的路由表,按固定的时间间隔交换路由信息。 路由表中最主要的信息就是:到某个网络的距离(即最短距离),以及应经过的下一跳地址。路由表更新的原则是找出到每个目的网络的最短距离。这种更新算法叫做距离向量算法。
内部网关协议OSPF
最主要的特征就是使用分布式的链路状态协议,而不是像RIP那样的距离向量协议,三个要点:向本自治系统中的所有路由器发送信息,发送的信息就是与本路由器相邻的所有路由器的链路状态,只有当链路状态发生变化时,路由器才向所有路由器采用洪泛法发送此信息。
外部网关协议BGP
路由器的构成
路由器是一种具有多个输入端口和多个输出端口的专用计算机,任务是转发分组,整个路由器结构可划分为两大部分:路由选择部分和分组转发部分。路由选择部分也叫做控制部分,其核心构件是路由选择处理机。路由选择处理机的任务根据所选定的路由选择协议构造出路由表,同时经常或定期地和相邻路由器交换路由信息而不断的更新和维护路由表。分组转发部分由三部分组成:交换结构、一组输入端口和一组输出端口。交换结构又称为交换组织,它的作用就是根据转发表对分组进行处理,将某个输入端口进入的分组从一个合适的输出端口转发出去。转发就是路由器根据转发表把收到的IP数据报从路由器合适的端口转发出去。“转发‘’仅仅涉及到一个路由器。但“路由选择”则涉及到很多路由器,路由表则是许多路由器协同工作的结果。路由表一般仅包含从目的网络到下一跳(用IP地址表示)的映射,而转发表是从路由表得出的。转发表必须包含完成转发功能所必须的信息。
网际组管理协议IGMP
当某个主机加入新的多播组时,该主机向多播组的多播地址发送一个IGMP报文,声明自己要成为该组的成员。本地的多播路由器收到IGMP报文后,还要利用多播路由选择协议把这种组成员关系转发给因特网上的其他多播路由器。
组成员关系是动态的。本地多播路由器要周期性的探寻局域网上的主机,以便知道这些主机是否还继续是组的成员。只要有一个主机对某个组响应,那么多播路由器就认为这个组是活跃的。但一个组在经过几次的探寻后仍然没有一个主机响应,多播路由器就认为本网络上的主机都离开了这个组,因此也就不再把这个组的成员关系转发给其他的多播路由器。
网络地址转换NAT
这种方法需要在专用网连接到因特网的路由器上安装NAT软件,装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。
5.运输层
网络层只把分组发送到目的主机,但是真正通信的并不是主机而是主机中的进程。运输层提供了进程间的逻辑通信,运输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看见的好像在两个运输层实体之间有一条端到端的逻辑通信信道。
UDP 和 TCP 的特点
- 用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。
- 传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。
TCP 首部格式
- 序号 :用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。
- 确认号 :期望收到的下一个报文段的序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。
- 数据偏移 :指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。
- 确认 ACK :当 ACK=1 时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。
- 同步 SYN :在连接建立时用来同步序号。当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中 SYN=1,ACK=1。
- 终止 FIN :用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。
- 窗口 :发送本报文段一方的接收端口。窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。
TCP的三次握手
假设 A 为客户端,B 为服务器端。
- 首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。
- A 向 B 发送连接请求报文段,SYN=1,ACK=0,选择一个初始的序号 x。
- B 收到连接请求报文段,如果同意建立连接,则向 A 发送连接确认报文段,SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y。
- A 收到 B 的连接确认报文段后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。
- B 收到 A 的确认后,连接建立。
采用三次握手是防止失效的连接请求报文段突然传送到服务端,因而产生错误。(失效的连接:client发送的一个连接请求并没有丢失,在网络中滞留了,以致延误到达server端。本来此连接早已失效,但是server端误以为是一个新的请求,就同意建立连接。如果不采用三次握手,只要server发出确认,连接建立了,但是client并没有请求发出,server端却一直在等待,浪费了很多资源。)
关于为什么不采用二次握手,如果客户端在二次握手后建立连接后不想连接了,服务端一直在等待,是不是又浪费很多资源呢。
TCP的四次挥手
以下描述不讨论序号和确认号,因为序号和确认号的规则比较简单。并且不讨论 ACK,因为 ACK 在连接建立之后都为 1。
- A 发送连接释放报文段,FIN=1。
- B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。
- 当 B 不再需要连接时,发送连接释放请求报文段,FIN=1。
- A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL 时间后释放连接。
- B 收到 A 的确认后释放连接
四次挥手的原因:
客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。
TIME_WAIT:
客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:
- 确保最后一个确认报文段能够到达。如果 B 没收到 A 发送来的确认报文段,那么就会重新发送连接释放请求报文段,A 等待一段时间就是为了处理这种情况的发生。
- 等待一段时间是为了让本连接持续时间内所产生的所有报文段都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文段。
2MSL:
MSL是Maximum Segment Lifetime英文的缩写,中文可以译为**“报文最大生存时间”**,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。(RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。)
TCP如何保证传输的可靠性
tcp 是面向连接,可靠的字节流服务。
面向连接意味着两个使用 tcp 的应用(通常是一个客户端和一个服务器)在彼此交换数
据之前必须先建立一个 tcp 连接。在一个 tcp 连接中,仅有两方进行彼此通信,广播和多播
不能用于 tcp。
Tcp 通过下列方式提供可靠性:
(TCP如何保证数据的可靠传输的(这个问题可以引申出很多子问题,拥塞控制慢开始、拥塞避免、快重传、滑动窗口协议、停止等待协议、超时重传机制,最好都能掌握))
1)将应用数据分割为 tcp 认为最合适发送的数据块;
2)**超时重传:**当 tcp 发出一个段后,他启动一个定时器,等待目的端确认收到这个报
文段。若不能及时收到一个确认,将重发这个报文段。
3)当 tcp 收到发自 tcp 链接另一端的数据时,它将发送一个确认(对于收到的请求,给
出确认响应)。这个确认不是立即发送,通常将推迟几分之一秒(之所以推迟,可能是要对
包做完校验);
4)若 tcp 收到包,校验出包有错,丢弃报文段,不给出响应,tcp 发送端会超时重传;
5)对于失序数据进行重新排序,然后交给应用层(tcp 报文段作为 ip 数据报进行传输,
而 ip 数据报的到达会失序,因此 tcp 报文段的到达也可能失序。若必要,tcp 将对收到的数
据进行重新排列,以正确的顺序交给应用层)。
6)对于重复数据,直接丢弃。
7)tcp 可以进行流量控制,防止较快主机致使较慢主机的缓冲区溢出。
Tcp的可靠传输有以下机制:
1,校验和(校验数据是否损坏);
2,定时器(分组丢失则重传);
3,序号(用于检测丢失的分组和冗余的分组);
4,确认(接收方告知发送方正确接收分组以及期望的下一个分组);
5,否定确认(接收方通知发送方未被正确接收的分组);
6,窗口和流水线(用于增加信道的吞吐量)。
流量控制和拥塞控制
拥塞控制的四种算法:1. 慢开始 2.拥塞避免 3. 快重传 4. 快恢复
-
慢开始:发送方维持一个拥塞窗口cwnd(congestion window),拥塞窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口等于拥塞窗口。
一开始cwnd = 1,发送第一个报文段M1,发送方收到接收方的确认后,将cwnd=2;然后发出M2,M3,接收到M2,M3后,将cwnd=4… 每经过一个传输轮次,拥塞窗口 cwnd 加倍。
-
拥塞避免:设置一个开始阈值ssthresh, 当 cwnd< ssthresh时,使用慢开始;cwnd > ssthresh时,使用拥塞避免。 即 每一个轮次,cwnd + 1.
在慢开始,拥塞避免阶段,如果发送方判断没有按时收到确认(即网络阻塞),将 ssthresh = cwnd/2, cwnd=1,执行慢开始。
- 快重传:前提,每收到一个失序的报文段就立即发出重复确认,如果连续收到三个重复确认,立即重传未被确认的报文段,而不必等待 重传计时器到期。
- 快恢复:与快重传配套使用,cwnd = ssthresh/2,然后使用 拥塞避免 线性增大。
常用端口
应用 | 应用层协议 | 端口号 | 运输层协议 | 备注 |
---|---|---|---|---|
域名解析 | DNS | 53 | UDP/TCP | 长度超过 512 字节时使用 TCP |
动态主机配置协议 | DHCP | 67/68 | UDP | |
简单网络管理协议 | SNMP | 161/162 | UDP | |
文件传送协议 | FTP | 20/21 | TCP | 控制连接 21,数据连接 20 |
远程终端协议 | TELNET | 23 | TCP | |
超文本传送协议 | HTTP | 80 | TCP | |
简单邮件传送协议 | SMTP | 25 | TCP | |
邮件读取协议 | POP3 | 110 | TCP | |
网际报文存取协议 | IMAP | 143 | TCP |
Web 页面请求过程(不全,应加入DNS解析具体过程)
1.浏览器分析连接指向页面的URL
2.浏览器向DNS服务器请求解析 www.tsinghua.edu.cn的IP地址
3.域名系统DNS解析出清华大学服务器的IP地址为166.111.4.100
4.浏览器与目标服务器在80端口上建立TCP连接。(在服务器端的IP地址为166.111.4.100,端口是80)
5.浏览器发出取文件命令: GET/chn/yxsz/index.html(请求页面的html)
6.服务器 www.tsinghua.edu.cn给出响应,把文件index.html发送给浏览器
7.浏览器在窗口内渲染html。(显示“清华大学院系设置”文件index.html中的所有文本)
8.窗口关闭时, 浏览器释放TCP连接
HTTP相关
HTTP:超文本传输协议,一个属于应用层的协议,基于TCP/IP来传递数据。特点是简单快捷,无状态(指的是对于事务处理没有记忆能力,意味着如果后续处理需要前面的信息,则它必须重传)。
基础概念
- 请求报文
- 响应报文
请求行/响应行 不一样,可以用来区分是请求报文还是响应报文
请求/响应首部
空行
请求体/响应体
-
请求行
- Get
获取资源
- Post
传输实体主体
POST 主要用来传输数据,而 GET 主要用来获取资源。
- put
上传文件
由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不使用该方法。
http 状态码
服务器返回的 响应报文 中第一行为状态行,包含了状态码以及原因短语,用来告知客户端请求的结果。
状态码 | 类别 | 原因短语 |
---|---|---|
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
1XX 信息
- 100 Continue :表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应。
2XX 成功
- 200 OK
- 204 No Content :请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。
- 206 Partial Content :表示客户端进行了范围请求。响应报文包含由 Content-Range 指定范围的实体内容。
3XX 重定向
- 301 Moved Permanently :永久性重定向,客户端可以将请求的地址服务端返回的地址。
- 302 Found :临时性重定向
- 303 See Other :和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源。
- 注:虽然 HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方法,但是大多数浏览器都会在 301、302 和 303 状态下的重定向把 POST 方法改成 GET 方法。
- 304 Not Modified :如果请求报文首部包含一些条件,例如:If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since,如果不满足条件,则服务器会返回 304 状态码。
- 307 Temporary Redirect :临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。
4XX 客户端错误
- 400 Bad Request :请求报文中存在语法错误。
- 401 Unauthorized :该状态码表示发送的请求需要有认证信息(BASIC 认证、DIGEST 认证)。如果之前已进行过一次请求,则表示用户认证失败。
- 403 Forbidden :请求被拒绝,服务器端没有必要给出拒绝的详细理由。
- 404 Not Found : 请求失败,请求的资源在服务器上未发现。
5XX 服务器错误
- 500 Internal Server Error :服务器正在执行请求时发生错误。
- 503 Service Unavilable :服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
具体应用
-
Cookie
- HTTP/1.1 引入 Cookie 来保存状态信息。Cookie 是服务器发送到用户浏览器并保存在本地的一个小小的文本文件(Set-cookie:12345678),它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上(首部行中 Cookie:12345678)。它用于告知服务端两个请求是否来自同一浏览器,并保持用户的登录状态。
- 会话期 Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。持久性 Cookie:指定一个特定的过期时间(Expires)或有效期(max-age)之后就成为了持久性的 Cookie。
-
Session
- 除了可以将用户信息通过 Cookie 存储在用户浏览器中,也可以利用 Session 存储在服务器端,存储在服务器端的信息更加安全。Session 可以存储在服务器上的文件、数据库或者内存中,现在最常见的是将 Session 存储在内存型数据库中,比如 Redis。
- 使用 Session 维护用户登录的过程如下:
- 用户进行登录时,用户提交包含用户名和密码的表单,放入 HTTP 请求报文中;
- 服务器验证该用户名和密码;
- 如果正确则把用户信息存储到 Redis 中,它在 Redis 中的 ID 称为 Session ID;
- 服务器返回的响应报文的 Set-Cookie 首部字段包含了这个 Session ID,客户端收到响应报文之后将该 Cookie 值存入浏览器中;
- 客户端之后对同一个服务器进行请求时会包含该 Cookie 值,服务器收到之后提取出 Session ID,从 Redis 中取出用户信息,继续之后的业务操作。
- 应该注意 Session ID 的安全性问题,不能让它被恶意攻击者轻易获取,那么就不能产生一个容易被猜到的 Session ID 值。此外,还需要经常重新生成 Session ID。在对安全性要求极高的场景下,例如转账等操作,除了使用 Session 管理用户状态之外,还需要对用户进行重新验证,比如重新输入密码,或者使用短信验证码等方式
Cookie 与 Session 选择
- Cookie 只能存储 ASCII 码字符串,而 Session 则可以存取任何类型的数据,因此在考虑数据复杂性时首选 Session;
- Cookie 存储在浏览器中,容易被恶意查看。如果非要将一些隐私数据存在 Cookie 中,可以将 Cookie 值进行加密,然后在服务器进行解密;
- 对于大型网站,如果用户所有的信息都存储在 Session 中,那么开销是非常大的,因此不建议将所有的用户信息都存储到 Session 中。
短连接与长连接
当浏览器访问一个包含多张图片的 HTML 页面时,除了请求访问 HTML 页面资源,还会请求图片资源,如果每进行一次 HTTP 通信就要断开一次 TCP 连接,连接建立和断开的开销会很大。长连接只需要建立一次 TCP 连接就能进行多次 HTTP 通信。
从 HTTP/1.1 开始默认是长连接的,如果要断开连接,需要由客户端或者服务器端提出断开,使用 Connection : close;而在 HTTP/1.1 之前默认是短连接的,如果需要长连接,则使用 Connection : Keep-Alive。
流水线
默认情况下,HTTP 请求是按顺序发出的,下一个请求只有在当前请求收到应答过后才会被发出。由于会受到网络延迟和带宽的限制,在下一个请求被发送到服务器之前,可能需要等待很长时间。
流水线是在同一条长连接上发出连续的请求,而不用等待响应返回,这样可以避免连接延迟。
HTTPs
HTTP 有以下安全性问题:
- 使用明文进行通信,内容可能会被窃听;
- 不验证通信方的身份,通信方的身份有可能遭遇伪装;
- 无法证明报文的完整性,报文有可能遭篡改。
预备知识:
- 公钥、私钥的简要介绍
- 对称加密:加密和解密使用同一个密钥,常见的算法:DES,AES,3DES等
- 非对称加密:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。 常见的算法:RSA,ECC
- 客户端/服务端/证书机构的关系
HTTps的工作流程:
工作流程可分为三个阶段:
- 浏览器A向服务器B发送浏览器的SSL版本号和一些可选的加密算法,B从中选择自己所支持的算法,并告知A
- 认证服务器:浏览器内置一个受信任的CA机构列表,并保存了这些CA机构的证书。第一个阶段中服务器会提供CA机构认证颁发的证书,如果认证该服务器证书的CA机构,存在于浏览器的受信任CA机构列表中,并且服务器证书中信息与当前正在访问的网站一致,那么浏览器认为当前服务端是可信的,并从服务器证书中取得服务器公钥。
- 协商会话密钥:客户端通过取得的公钥与服务器进行加密通信,协商出两个会话密钥,分别是用于加密客户端往服务端发送数据的客户端会话密钥,用于加密服务端往客户端发送数据的服务端会话密钥。在已有服务器公钥,可以加密通讯的前提下,还要协商两个对称密钥的原因,是因为非对称加密相对复杂度更高,在数据传输过程中,使用对称加密,可以节省计算资源。
- 加密通讯:此时客户端服务器双方都有了本次通讯的会话密钥,之后传输的所有Http数据,都通过会话密钥加密。
HTTPs相关面试题:
- 在客户端抓包抓到的是加密的还是没加密的? 答:没有加密的。https 若在浏览器端抓包,是可以看到数据的,并没有加密,抓到的是加密之前的。
HTTPs 并不是新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信。也就是说 HTTPs 使用了隧道进行通信。
通过使用 SSL,HTTPs 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)。
完整性保护
HTTPs 的缺点
- 因为需要进行加密解密等过程,因此速度会更慢;
- 需要支付证书授权的高费用。
GET和POST的区别
- 作用:GET 用于获取资源,而 POST 用于传输实体主体。
- 参数:GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。
GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
不能因为 POST 参数存储在实体主体中就认为它的安全性更高,因为照样可以通过一些抓包工具(Fiddler)查看。
因为 URL 只支持 ASCII 码,因此 GET 的参数中如果存在中文等字符就需要先进行编码,例如中文会转换为%E4%B8%AD%E6%96%87,而空格会转换为%20。POST 支持标准字符集。
-
安全:
**安全的http方法不会改变服务器的状态,也就是说它只是可读的。**GET 方法是安全的,而 POST 却不是,因为 POST 的目的是传送实体主体内容,这个内容可能是用户上传的表单数据,上传成功之后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变。
安全的方法除了 GET 之外还有:HEAD、OPTIONS。
不安全的方法除了 POST 之外还有 PUT、DELETE。
-
幂等性
幂等的 HTTP 方法,同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。
GET,HEAD,PUT 和 DELETE 等方法都是幂等的,而 POST 方法不是。所有的安全方法也都是幂等的。
- 可缓存
如果要对响应进行缓存,需要满足以下条件:
- 请求报文的 HTTP 方法本身是可缓存的,包括 GET 和 HEAD,但是 PUT 和 DELETE 不可缓存,POST 在多数情况下不可缓存的。
- 响应报文的状态码是可缓存的,包括:200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501。
- 响应报文的 Cache-Control 首部字段没有指定不进行缓存。
forward和redirect的区别
-
转发(forward):1. 是服务器内部的重定向,服务器直接访问目标地址的 url网址,把里面的东西读取出来,但是客户端并不知道,因此用forward的话,客户端浏览器的网址是不会发生变化的。2.关于request: 由于在整个定向的过程中用的是同一个request,因此forward会将request的信息带到被重定向的jsp或者servlet中使用。
-
重定向(redirect):1.是客户端的重定向,是完全的跳转。即服务器返回的一个url给客户端浏览器,然后客户端浏览器会重新发送一次请求,到新的url里面,因此浏览器中显示的url网址会发生变化。
2.因为这种方式比forward多了一次网络请求,因此效率会低于forward。一般用于用户的非正常访问,如未登录的用户将该请求重定向到登录页面。在Servlet中,使用response对象的SendRedirect()方法,告诉浏览器重定向的URL。
//Servlet中处理get请求的方法 public void doGet(HttpServletRequest request,HttpServletResponse response){ //请求重定向到另外的资源 response.sendRedirect("资源的URL"); }