1. OSI协议
两个维度
横向看,为哪两个平行的东西提供什么服务
纵向看看,为上层提供了什么服务
应用层
- 为应用程序间提供通信和交互协议
- DNS、HTTP、SMTP等
传输层
- 为两台主机间的进程提供数据传输服务
- 为上层提供服务:把应用层报文封装成TCP或UDP报文段,进行传输
- TCP、UDP
网络层
- 为两台主机提供通信服务
- 为上层提供服务:把传输层的TCP或UDP报文段,封装成IP数据报,进行传输。
- ARP、ICMP
数据链路层
- 为两台主机提供数据传输服务,数据需要在一段一段的链路上传送。
- 为上层提供服务:把IP数据报封装成帧,在链路上传输。
- CSMA /CD、 PPP
物理层
- 在传输介质上传输比特流
- 为上层提供服务:尽可能为数据链路层屏蔽传输媒体和硬件的差异,把帧拆分成比特流在传输媒介上传输。
- 时分复用、频分、码分多址、波分复用
2. 应用层
2.1 DNS协议
是域名解析协议,提供了域名和 IP 地址之间相互转换的服务。
可以使用 UDP 或 TCP,但一般用 UDP 因为快,只要一个请求,一个应答就 ok 了
但 UDP 协议传输的内容不能超过 512 字节,一般上客户端向 DNS 服务器查域名,返回的内容都不超过 512 字节,用 UDP 就够了。
为什么区域传送用TCP呢?
什么是区域传送,就是 主 DNS 服务器上的数据有变化了,需要向下传送变化的那部分数据时,因为数据必然很大,并且要保证传输可靠,所以不能用 UDP。
因为 DNS 是分布式数据库,要从主 DNS 上复制内容时,不能用不可靠的 UDP,需要用 TCP 协议。
2.2 DHCP协议
给用户提供了即插即用的联网方式,用户不需要再手动配置 IP 地址等信息。
其自动为用户配置 IP 地址、子网掩码、网关等信息。
2.3 其他常见应用层协议
FTP文件传输协议、SMTP电子邮件协议
2.4 Web页面的请求过程
URL 敲下之后,浏览器是想要生成一个 TCP 套接字,以向目标 HTTP 服务器请求资源。
为了生成 TCP 套接字,我们必须知道域名对应的 IP 地址;
为了知道域名的 IP 地址,我们必须先向 DNS 服务器发送 DNS 查询报文;
为了向 DNS 服务器发送 DNS 查询报文,需要知道默认网关的 MAC 地址。
为了知道其 MAC 地址,必须用 ARP 协议进行解析出下一跳,也就是默认网关的 MAC 地址。
拿到默认网关 MAC 地址后,会封装一个 DNS 查询报文,向 DNS 发送 查询请求。
DNS 服务器收到请求后,把查询结果放在 UDP 报文段中,返回给主机。
主机现在拿到了域名对应的 IP 地址,可以生成套接字,把套接字用于向 HTTP 服务器发送 HTTP GET 报文了。
而在生成 TCP 套接字之前,要进行三次握手的连接
1
2
3
连接之后,把 GET 请求封装在报文中,交付给 HTTP 服务器。
HTTP 服务器拿到请求报文后,返回对应的 Web 资源。
浏览器收到 HTTP 响应之后,抽取 Web 页面的内容进行渲染。
2.5 HTTP状态码
1xx表示成功
2xx表示成功
3xx表示重定向
4xx表示客户端的请求错误,比如404资源没找到
5xx表示服务器错误
2.6 HTTP长连接和短连接?流水线知道是什么吗?
长连接:
当浏览器访问一个包含多张图片的网页时,如果用短连接就会建立大量TCP连接,这样很耗资源。
长连接允许只建立一个TCP连接,就能进行多次HTTP通信。
http1.1 之前默认短连接
http1.1 以后默认长连接
流水线:
默认情况下,HTTP请求是按顺序发的,下一个请求只有在当前请求收到响应之后才会被发出,有点像停止等待协议。而在收到下一个请求之前,可能需要很长时间。
流水线就是在一个HTTP长连接下连续发出请求,不用等待响应返回,减少延迟。
2.7 Cookie和Session的区别
cookie:
what:cookie 是保存在客户端浏览器里的一种信息载体。
why:用来保存一些站点的用户数据,这样能够为用户定值一些功能,比如免登陆功能。
how:服务器发送的响应报文的首部有一个 set-cookie 字段,客户端在拿到这个响应后把这个字段的内容保存到浏览器中。在客户端再次发送请求同类资源时,就会把 cookie 一起携带在请求中,发送到服务端。
session
what:服务器会给每个浏览器创建一个 session 对象,保存在服务器里。
why:存储在浏览器的 cookie 不安全,可能会有一些 js 脚本能拿到 cookie 的信息,所以存储在服务器更加安全一些。
how:使用 session 维护用户登陆状态如下
用户登陆时,把用户名密码表单,放入 http 请求报文中。
服务器收到后,为其创建一个 session,并创建一个名为 sessionID 的 cookie,其值就映射了服务器里的 session。
客户端收到这个 cookie 后,把 sessionID 保存在 cookie 里。
客户端之后对同一个服务器进行请求时,会把 cookie 也带上去,服务器收到之后提取出 sessionID,从中读取出用户信息。
以上分析就可以轻易的看出 cookie 和 session 的区别
cookie 存放在客户端,session 存放在服务器端
cookie 的安全性没有 session 高
浏览器如果禁用了 Cookie
URL 重写技术,可以把 sessionID 作为 URL 的参数进行传递。
其他临场发挥:
生命周期:都是可以设置的
作用域:都是可以设置的
2.8 HTTP1.1和1.0的主要区别
1.长连接 短连接
Coonnection:keep-alive
2.状态错误响应码
HTTP新增了一些错误状态响应码
2.9 请求转发和重定向的区别
请求转发
浏览器只发送一次请求,收到一次响应
请求所转发到的资源中可以直接获取到请求中所携带的数据
浏览器地址栏显示的为用户所提交的请求路径,不会改变
只能跳转到当前应用的资源中。
重定向
浏览器发出两次请求,接收到两次响应。
重定向到的资源不能直接获取到用户提交请求中所携带的数据。
浏览器地址栏显示的为重定向的请求路径,而非用户提交请求的路径。也正因如此,重定向的一个很重要的作用是,防止表单的重复提交(恶意刷新页面,每刷新一次,就重新提交一次)
重定向不仅可以跳转到当前应用的其它资源,也可以跳转到其它应用中的资源。
如何选择?一般选转发,重定向的两种实用场景:
如果需要跳转到其它应用,肯定重定向。
如果处理表单数据的 servlet 需要跳转到其它的 servlet,则需要选择重定向,防止表单重复提交。(例如:博客项目的 login 登陆接口)
2.10 URL和URI的区别
URI 更像是一个身份证,是资源的标志符。
URL 更像是一个地址,是资源的定位符。
一个 URL 可以确定哪个主机的哪个项目下的哪个资源。
2.11 HTTP和HTTPS的区别
端口来讲:http 端口默认是 80,https 默认端口号是 443
安全性来讲:HTTP 是运行在 TCP 之上的,所有传输都是明文传输,客户端和服务端无法验明对方的身份。而 HTTPS 在中间加了一层 SSL 协议,SSL 协议是运行在 TCP 之上的,所有的传输内容都经过加密,这个加密其实是对称加密。而对称密钥是用服务器方的公钥进行了非对称加密传输过去的。
- 对称加密算法:加密解密为同一个密钥,且速度很快。
- 非对称加密算法:密钥成对出现,公钥加密,私钥解密或者私钥加密,公钥解密。算法较为复杂,消耗资源更多。
2.12 SSL过程
1.讲讲SSL的过程
首先客户端向服务器发起 SSL 连接请求。
服务器把自己的证书发给客户端的浏览器。
客户端浏览器检查服务器过来的证书是不是 CA 签发的,如果是,就继续执行协议,如果不是,就发出一个警告,询问是否继续。
继续协议:从证书中把服务器的公钥拿下来,用公钥加密通信用的对称密钥,发给服务器。
服务器用自己的私钥对其解密,拿到对称密钥。
接下来就可以进行数据传输,服务器和客户端双方用相同的对称密钥对数据加密,可以保证安全。
2.怎么保证不被篡改
服务器事先已经向 CA 申请,CA 是大家都信任的机构, CA 在判明申请者的身份之后,会用自己的私钥对服务器的公开密钥加密,也就是做了个数字签名,然后把这个经过数字签名之后的证书一起发给客户端,客户端拿到之后用数字签名进行验证,如果验证通过,就可以开始通信了。
3.关键点
其实单独的非对称加密的一个弱点就是,公钥可能被伪造,比如 A、B通信之间隔了个C,这个C把 A、B通信时用的公钥全部换了,这样也是没办法验证身份的。
那只需要保证公钥不被伪造就可以了,CA 的公钥大家都相信,甚至已经内置在浏览器里,不会被伪造,都相信 CA 所以只要数字签名认证通过,就可以完全信任服务器了。
2.13 GET和POST区别
- get 是获取数据,post 是修改数据
- get 把请求的数据放在 url 上, 以?分割URL和传输数据,参数之间以&相连,所以get不太安全。而post把数据放在HTTP的包体内(requrest body)
- get 提交的数据最大是 2k( 限制实际上取决于浏览器), post 理论上没有限制。
- GET 产生一个 TCP 数据包,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据); POST产生两个TCP数据包,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
- GET请求会被浏览器主动缓存,而POST不会,除非手动设置。
- 本质区别:GET是幂等的,而POST不是幂等的
3.传输层
3.1 TCP三次握手
明确四个概念的表达!
SYN:请求连接标志位!
ACK:确认标志位!
seq:序号!
ack:确认号!
为何要三次握手?
从第一个角度。通信是双方的行为,双方都需要确认四件事,自身的接收发送是否正常以及对方的接收发送是否正常。如果仅两次的话,服务端是没有办法确认自己发送和对方接收是否正常的,不是可靠的连接。
从第二个角度。也可以防止失效连接到达服务器后重新打开连接。客户端发送的请求如果阻塞。那么客户端等待一个超时重传时间以后,会重发一个连接请求。假设这个来迟滞留的请求最终到达了服务器,如果不三次握手的话,服务器就会打开两个连接。如果有第三次握手,客户端就会忽略掉服务器之后的连接确认请求。
- ⼀个「旧 SYN 报⽂」⽐「最新的 SYN 」 报⽂早到达了服务端;
- 那么此时服务端就会回⼀个 SYN + ACK 报⽂给客户端;
- 客户端收到后可以根据⾃身的上下⽂,判断这是⼀个历史连接(序列号过期或超时),那么客户端就会发送
- RST 报⽂给服务端,表示中⽌这⼀次连接。
如果 1、2、3 次握手分别丢包了,会发生什么?
第一次客户端发的 SYN 丢了:
客户端迟迟接不到响应,超时重传。
第二次服务端发的 SYN 和 ACK 丢了
客户端迟迟接不到响应,超时重传
第三次客户端发的 ACK 丢了?
因为第三次发完 ACK 之后,随时接下来会继续往服务端发数据,我看过一篇博客里写的是发数据时会带上 ACK,所以客户端响应的 ACK 包丢了,服务器也能够通过之后的包来建立连接。
第三次故意不发送 ACK 呢?
洪水攻击,服务器在等待第三次握手时是处于半连接状态,也是需要耗费资源的,如果有攻击者故意不发送第三次 ACK,让大量连接处于半连接状态,那么会把服务器资源耗尽,洪水攻击的目的就达到了。
解决:Linux网络参数修改,SYN_RCVD 状态连接的最⼤个数,多余拒绝
3.2 TCP四次挥手
四次挥手的原因
服务端在收到客户端的 FIN 报文后,仅表示客户端不在发送数据了,但客户端还可以接,而服务端也不是说数据都发完了,所以服务端可以立即关闭,也可以再发送一段时间的数据后再发送 FIN 报文给客户端表示同意关闭。
为什么客户端要等待 2MSL 后再释放连接
第一个角度:确保最后一个确认报文能到达,如果服务器没收到来自客户端的 ACK 报文,就会重新发送 FIN 报文到客户端,客户端等待一段时间就是为了处理这种延迟的情况。
第二个角度:等待一段时间是为了让本连接持续的时间内所有报文从网络中消失,使得下一个新连接里不会出现旧的报文。
3.3 TCP如何实现可靠传输
首先可靠传输的基础是滑动窗口协议,配合着一些其他的控制来使得整个传输过程可靠。这些控制我觉得可以按分为三部分去解释,一个是基本的控制、一个是发送端的控制、一个是接收端的控制。
1.首先详细说一下滑动窗口协议:
首先在发送方和接收方都维护一个滑动窗口,发送方的窗口大小其实是由接收方的响应报文里的一个字段控制的。
发送方:窗内都允许被发送,窗内最左侧的字节如果已发送并且被确认,向右滑动,直到第一个不是被确认状态的字节。
接收方:窗内都允许被接收,窗内最左侧的字节如果已接收,向右滑动到第一个不是已接收的状态的字节。并且最重要的是,接收方仅对最后一个按序到达的字节进行确认(因为滑动窗口的累计应答)!
2.然后说一下这些控制,从三个方面来讲
基本的控制:
- 把应用层的数据拆分成适合传输的一个个块儿。
- 给发送的每一个块儿进行编号,在接收端对数据包进行重排。
发送端的控制:
- 超时重传技术(两个公式细节在下面):当发送方发送一个包时,启动一个定时器,等待确认这个包,如果不能在阈值内收到确认这个包,则重发。
- 流量控制:为了控制发送方发送速率,保证接收方来得及接收。接收端返回的确认报文中的窗口字段可以控制发送窗口大小,从而影响发送方的速率。将窗口字段设置为 0,则不能发送数据。
- 拥塞控制(四个算法细节在下面):当网络拥塞时,会丢包,此时发送方会不断尝试重传,从而导致拥塞程度更高。因此当出现拥塞时,应当限制发送方的发送速率。和流量控制很像但目的不同。流量控制更多的是一个端到端的控制,要做的是抑制发送端发送数据的速率,主要是为了控制接收方来得及接。而拥塞控制是为了宏观上降低网络的拥塞程度。慢启动、拥塞避免、拥塞发⽣、快速恢复,四个算法实现。
接收端的控制:
- 校验和:保证首部的数据的校验和。如果校验和有误,那么就丢弃该数据包,且不发送确认消息。
- 丢弃重复:如果收到重复的数据包,直接丢弃。
3.4 UDP协议讲讲
UDP与TCP的不同:
1. 连接
TCP 是⾯向连接的传输层协议,传输数据前先要建⽴连接。
UDP 是不需要连接,即刻传输数据。
2. 服务对象
TCP 是⼀对⼀的两点服务,即⼀条连接只有两个端点。
UDP ⽀持⼀对⼀、⼀对多、多对多的交互通信
3. 可靠性
TCP 是可靠交付数据的,数据可以⽆差错、不丢失、不᯿复、按需到达。
UDP 是尽最⼤努⼒交付,不保证可靠交付数据。
4. 拥塞控制、流量控制
TCP 有拥塞控制和流ᰁ控制机制,保证数据传输的安全性。
UDP 则没有,即使⽹络⾮常拥堵了,也不会影响 UDP 的发送速率。
5. ⾸部开销
TCP ⾸部⻓度较⻓,会有⼀定的开销,⾸部在没有使⽤「选项」字段时是 20 个字节,如果使⽤了「选项」
字段则会变⻓的。
UDP ⾸部只有 8 个字节,并且是固定不变的,开销较⼩。
6. 传输方式
TCP 是流式传输,没有边界,但保证顺序和可靠。
UDP 是⼀个包⼀个包的发送,是有边界的,但可能会丢包和乱序。
7. 分片不同
TCP 的数据⼤⼩如果⼤于 MSS ⼤⼩,则会在传输层进⾏分⽚,⽬标主机收到后,也同样在传输层组装 TCP
数据包,如果中途丢失了⼀个分⽚,只需要传输丢失的这个分⽚。
UDP 的数据⼤⼩如果⼤于 MTU ⼤⼩,则会在 IP 层进⾏分⽚,⽬标主机收到后,在 IP 层组装完数据,接着
再传给传输层,但是如果中途丢了⼀个分⽚,在实现可靠传输的 UDP 时则就需要᯿传所有的数据包,这样
传输效率⾮常差,所以通常 UDP 的报⽂应该⼩于 MTU。
3.5 TCP和UDP的应用场景
由于 TCP 是⾯向连接,能保证数据的可靠性交付,因此经常⽤于:
FTP 文件传输
HTTP / HTTPS
由于 UDP ⾯向⽆连接,它可以随时发送数据,再加上UDP本身的处理既简单⼜⾼效,因此经常⽤于:
包总量较少的通信,如 DNS 、 SNMP 等
实时视频、音频等多媒体通信
广播播通信
4.网络层
4.1 ARP协议
这个协议主要提供了由目的 IP 地址得到目的 MAC 地址的功能。
因为网络层讲的是 主机和主机 之间的通信,所有下面就把所有的描述成主机之间的通信。
if在同一个局域网中:主机 A 想往主机 B 发信息时,会先在自己的 ARP 缓存表中查找是否有对应 主机B IP 地址的 MAC 地址,如果没有,则发送一次 广播 ARP 请求分组,主机 B 和主机 A 在同一个局域网,则主机 B 收到 ARP 请求分组时,会回发一个 ARP 响应分组,里面带有自己的 MAC 地址。
if不在同一个局域网中:主机 A 会先把子网掩码和目的 IP 进行相与,发现不一个网段,那么其下一跳就直接找默认网关就可以了,如果 ARP 缓存里没有默认网关的 MAC 地址,也需要先发一个 ARP 请求分组,等默认网关给他回一个 ARP 响应分组后,就拿到了默认网关的 MAC 地址。
路由器会帮他广播,找到主机 B 的 MAC 地址,然后主机 B 会回答一个 ARP 响应分组给 主机 A 然后就拿到了!
4.2 ICMP协议
what?
本质还是个 IP 数据报,IP数据报的数据段用 ICMP 报文代替了而已。
主要的功能包括:确认 IP 包是否成功送达⽬标地址、报告发送过程中 IP 包被废弃的原因和改善⽹络设置
等。
why?
ICMP 协议是网络层的协议,其主要的作用是用来提高交付成功的机会,让网络节点能够报告差错情况和异常情况的。分为差错报告报文和询问报文。
how?
差错报告报文至少有四种:
- 终点不可达报文,当路由器和主机没办法交付数据,就向源头发送一个终点不可达报文。
- 时间超过:如果路由器发现数据的 TTL 为 0,那么丢弃该数据,并向源头发送一个时间超过报文。可以用于 traceRoute
- 参数问题:如果路由器或主机发现 IP 数据报的首部有错误时,就告诉发给源头一个参数问题报文。
- 改变路由报文:路由器给主机发送这个报文,告诉他有更好的路径。
询问报文有两种:
- echo(回声) 请求报文或回答报文:主机或路由器向一个特定的主机发送回声请求报文,目的主机收到后回一个回答报文。
- 时间戳请求和回答报文:向服务器请求一个时间戳,用来时钟同步和测时间。
应用:
ping命令
路由跟踪
5.其他
几种中间设备的区别
- 物理层使用的中间设备
- 转发器/中继器/放大器(repeater):放大信号,防止传输过程中因减弱照成失真。
- 集线器(Hub):星形网络结构,将一些机器连接起来组成一个局域网,把一个端口接收到的所有信号,从其他端口发出去,只能广播传输。
- 适配器(Adapter):主机网卡,MAC地址固化在适配器的ROM中,计算机与外接局域网连接时,需要通过适配器完成。适配器中还有缓冲存储器,存储网络数据,还能过滤网络包,不匹配的MAC地址会丢弃。
- 数据链路层使用的中间设备
- 网桥/桥接器(Bridge):将收到的MAC帧根据MAC地址进行过滤和转发,网桥将网络的多个网段在数据链路层连接起来,在数据链路层扩展以太网用到的就是网桥(还有交换机,后面说)。
- 交换机(Switch):网桥可以说是交换机的前身,这里说的交换机是以太网交换机,又叫交换式集线器。交换机实质上是一个多接口的网桥,通常有十几个或者更多的接口,采用全双工工作方式,具有并行性,可以同时连通多对接口、多对主机进行通信,有自学功能,这种自学功能就使得交换机能即插即用,不需要进行人工配置,非常方便。
- 网络层使用的中间设备叫做路由器(router)
- 在网络层以上使用的中间设备叫做网关(gateway)。网关用来连接两个不兼容的系统需要在高层进行协议的转换。比如,不同局域网之间的连接。
当中间设备为转发器或网桥时,仅仅把一个网络扩大了,仍是一个网络。
由于历史原因,现在默认把路由器称作网关。