NetWork
本文鉴于个人搜集资料文章总结所得,若有错误请尽快联系我!
文章目录
计算机网络体系结构, 可以分为四层也可以是7层:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ClwAUQh-1590151948375)(https://github.com/CyC2018/Interview-Notebook/raw/master/pics/1005dc9d-9049-4b06-9524-6171e56ebd8c.png)]
-
应用层
为特定应用程序提供数据传输服务,例如 HTTP、DNS 等。数据单位为报文。
-
运输层
提供的是进程间的通用数据传输服务。由于应用层协议很多,定义通用的运输层协议就可以支持不断增多的应用层协议。运输层包括两种协议:传输控制协议 TCP,提供面向连接、可靠的数据传输服务,数据单位为报文段;用户数据报协议 UDP,提供无连接、尽最大努力的数据传输服务,数据单位为用户数据报。TCP 主要提供完整性服务,UDP 主要提供及时性服务。
-
网络层
为主机之间提供服务,而不是像运输层协议那样是为主机中的进程提供服务。网络层把运输层传递下来的报文段或者用户数据报封装成分组来进行传输。
-
数据链路层
网络层针对的还是主机之间,而主机之间可以有很多链路,链路层协议就是为相邻结点之间提供服务。数据链路层把网络层传来的分组封装成帧。
-
物理层
考虑的是怎样在传输媒体上传输数据比特流,而不是指具体的传输媒体。物理层的作用是尽可能屏蔽传输媒体和通信手段的差异,使物理层上的数据链路层感觉不到这些差异。
IP(网络层)
用于报文交换网络的一种面向数据的协议,是TCP/IP协议中网络层的主要协议;
主要根据源主机和目的主机的地址传送数据;有IPv4和IPv6;
-
网络层的结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q9NBZQEe-1590151948377)(https://github.com/CyC2018/Interview-Notebook/raw/master/pics/163cf8b4-5f30-46c9-af00-316a71b3c890.jpg)]
- 地址解析协议 ARP(Address Resolution Protocol)
- 网际控制报文协议 ICMP(Internet Control Message Protocol)
- 网际组管理协议 IGMP(Internet Group Management Protocol)
-
IP数据报格式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LVlVfU0u-1590151948379)(https://github.com/CyC2018/Interview-Notebook/raw/master/pics/8681db55-0873-434b-aa98-83d07e8392ae.jpg)]
-
版本 : 有 4(IPv4)和 6(IPv6)两个值;
-
首部长度 : 占 4 位,因此最大值为 15。值为 1 表示的是 1 个 32 位字的长度,也就是 4 字节。因为首部固定长度为 20 字节,因此该值最小为 5。如果可选部分的长度不是 4 字节的整数倍,就用尾部的填充部分来填充。
-
区分服务 : 用来获得更好的服务,一般情况下不使用。
-
总长度 : 包括首部长度和数据部分长度。
-
标识 : 在数据报长度过长从而发生分片的情况下,相同数据报的不同分片具有相同的标识符。
-
片偏移 : 和标识符一起,用于发生分片的情况。片偏移的单位为 8 字节。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VbalX1am-1590151948380)(https://github.com/CyC2018/Interview-Notebook/raw/master/pics/45c86855-9b18-4cf4-a9a7-f8b6eb78d133.png)] -
生存时间 :TTL,它的存在是为了防止无法交付的数据报在互联网中不断兜圈子。以路由器跳数为单位,当 TTL 为 0 时就丢弃数据报。
-
协议 :指出携带的数据应该上交给哪个协议进行处理,例如 ICMP、TCP、UDP 等。
-
首部检验和 :因为数据报每经过一个路由器,都要重新计算检验和,因此检验和不包含数据部分可以减少计算的工作量。
-
-
IP地址
- A:前8位网络号,后24位主机号,以0开头
- B:前16位网络号,后16位主机号,以10开头
- C:前24位网络号,后8位主机号,以110开头
- D:多播地址,1110开头
- E:保留地址,1111开头
- 全是0的主机号代表网络本身
- 全是1的主机号代表广播,用于向该网络中所有主机发送消息;
- 以十进制127开头的地址是环回地址,目的地址是环回地址的
-
ARP
把IP地址映射位物理地址;反之为RARP;
-
子网掩码
32位地址,1表示网络位,0表示主机位;指明一个IP地址的哪些位标识的是主机所在的子网以及哪些位标识是主机的位掩码,必须和IP地址结合使用;
作用:将某个Ip地址分成网络地址和主机地址;
TCP/IP(运输层)
-
什么是TCP/IP
TCP/IP是一类协议系统,用于网络通信的一套协议集合;
现在的 TCP/IP 体系结构不严格遵循 OSI 分层概念,应用层可能会直接使用 IP 层或者网络接口层。
-
TCP
运输层: 运输层提供了应用进程间的逻辑通信。运输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看见的好像在两个运输层实体之间有一条端到端的逻辑通信信道。
TCP: 是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块)
意义:应用层之间需要可靠的像管道一样的连接,网络层不提供,只提供不可靠的包交换,因此需要运输层的协调;
-
首部格式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KPVfiipE-1590151948381)(https://github.com/CyC2018/Interview-Notebook/raw/master/pics/21a00b02-c0a6-4bcd-9af0-5ec6bb66e34c.jpg)]
-
seq序号 :用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。
-
ack确认号 :期望收到的下一个报文段的序号。例如 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 时,表示此报文段的发送方的数据已发送完毕,并要求释放运输连接。
-
窗口 :窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。
-
-
作用:
- 将应用层向传输层发送网间传输的、8位字节表示的数据流分成适当长度的报文段,收链路层最大传输单元MTU限制;
- 传包给网络层,TCP为了不丢包,每个包一个序号,保证了传送到接收端实体的包能按序接受,然后接受实体收到包后返回相应的ACK确认
- 如果发送端实体再合理的RTT(往返时延)没收到确认,那么对应的数据包就被认为丢失,将重传
- TCP用一个校验和(Checksum)函数来检验数据是否错误,发送和接受都需要计算这个
-
三次握手
seq数据包本身序列号;ack期望继续发送数据包序列号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d62KyWVK-1590151948382)(https://github.com/CyC2018/Interview-Notebook/raw/master/pics/086871db-5871-460f-97b7-126cd738bb0e.jpg)]
-
TIME_WAIT
客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间。这么做有两个理由:
确保最后一个确认报文段能够到达。如果 B 没收到 A 发送来的确认报文段,那么就会重新发送连接释放请求报文段,A 等待一段时间就是为了处理这种情况的发生。
可能存在“已失效的连接请求报文段”,为了防止这种报文段出现在本次连接之外,需要等待一段时间。
-
-
TCP滑动窗口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6sfykgQ7-1590151948383)(https://github.com/CyC2018/Interview-Notebook/raw/66d63de8b875ff9be79763fb9bbed93f183403cb/pics/223fc26e-2fd6-484c-bcb7-443cac134f15.jpg)]
窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。 -
慢启动和拥塞避免
所以需要设置一个慢开始门限ssthresh状态变量:
-
当cwnd < ssthresh, 使用慢启动算法
-
当cwnd > ssthresh, 使用拥塞避免算法, 停用慢启动算法
-
慢启动思路
开始发送方先设置cwnd(拥塞窗口)=1, 发送第一个报文段M1, 接收到接收方的确认后, 把cwnd 加倍(2), 接着一直重复下去
-
拥塞避免
为了防止cwnd增加过快而导致网络拥塞, 每经过一个RTT事件就把发送方的cwnd+1, 这里不是加倍;
-
拥塞控制
当发送方判断网络出现拥塞(没收到确认), 就把门限ssthresh设置为出现拥塞时的拥塞窗口值的一半(除以2), 再把cwnd设为1, 重新开始慢启动算法(目的是较少发送到网络种的分组数, 使得积压的分组被处理完毕)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uDtCnlzQ-1590151948384)(http://p2e1umi3v.bkt.clouddn.com/18-3-9/81168366.jpg)]
-
-
快重传 和 快恢复
-
接收方每次接受到报文段都会对已收到的有序报文段确认, 例如已经接收到M1,M2,此时收到M4, 应当发送对M2的确认
-
发送方如果收到三个重复的确认, 那么可以确认下一个报文段丢失, 例如收到三个M2, 那么M3丢失, 此时启动快重传
只是丢失个别报文段的这种情况下, 一般不会网络拥塞, 所以执行快恢复, 设ssthresh = cwnd/2 ,cwnd =ssthresh, 并且启动拥塞避免;
-
-
-
UDP
是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RNf9VgBr-1590151948384)(https://github.com/CyC2018/Interview-Notebook/raw/master/pics/bd6c05f3-02ee-4c8a-b374-40c87154a898.jpg)]
-
TCP和UDP的应用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8QUGhrBf-1590151948385)(http://p2e1umi3v.bkt.clouddn.com/18-3-9/50470979.jpg)]
HTTP和HTTPS(引用层)
-
HTTP
Hyper Text Transfer Protocal超文本传输协议;用于万维网服务器传输超文本到本地浏览器的传输协议;基于TCP/IP的应用层协议
-
特点
- 简单快速:请求方法有GET,POST,PUT等;
- 灵活:允许传输任意类型的数据对象,传输类型有content-type标记
- 无连接:限制每次连接只处理一个请求,服务器处理完用户请求并受到客户端的应答后,即断开连接.但是在Http1.1的时候默认为长连接
- 无状态:服务器不会为下一次连接而维护这次连接所传输的信息,没有记忆性;
-
请求方式
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SZo0mHLi-1590151948385)(http://p2e1umi3v.bkt.clouddn.com/18-3-9/67661190.jpg)]来源: 菜鸟教程 -
get和post的区别
- get能被缓存
- get请求回保存在浏览器的记录中,也能保存为书签
- get有长度限制而post没有
- get不安全,post安全
- get只当用于取回数据
- get不应再处理敏感数据时使用
- post参数不会保存再浏览器历史或服务器日志中
-
状态码(这个很少问)
- 1xx: 信息相应,接受到请求
- 2xx: 处理成功响应,被成功接受
- 3xx: 重定向响应,完成制定的动作,必须接受进一步
- 4xx: 客户端错误,请求语法错误
- 5xx: 服务端错误,不能执行一个正确的请求
-
-
HTTPS
HTTPS以安全为目标的HTTP通道,在HTTP加入SSL层,HTTPS的安全基础就是SSL(Secure Sockets Layer),加密的详细内容需要SSL;
两种方式确保安全:建立信息安全通道;确认网站的真实性;
- 加密流程
- 客户端使用https访问URL, 与服务器建立SSL连接
- 服务器收到请求, 返回网站的证书信息(包含公钥)
- 客户端和服务端开始ssl连接的安全等级
- 根据双方同意的安全等级, 建立会话密钥, 利用网站的公钥将会话密钥加密, 传送到服务器
- 服务器利用自己的私钥解密出会话密钥
- 服务器利用会话密钥加密与客户端的通信
-
客户端的浏览器向服务器传送客户端SSL 协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息。
-
服务器向客户端传送SSL 协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。
-
客户利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,将继续进行第四步。
-
用户端随机产生一个用于后面通讯的“对称密码”,然后用服务器的公钥(服务器的公钥从步骤②中的服务器的证书中获得)对其加密,然后传给服务器。
-
服务器用私钥解密“对称密码”(此处的公钥和私钥是相互关联的,公钥加密的数据只能用私钥解密,私钥只在服务器端保留。然后用其作为服务器和客户端的“通话密码”加解密通讯。同时在SSL 通讯过程中还要完成数据通讯的完整性,防止数据通讯中的任何变化。
-
客户端向服务器端发出信息,指明后面的数据通讯将使用的步骤⑤中的主密码为对称密钥,同时通知服务器客户端的握手过程结束。
-
服务器向客户端发出信息,指明后面的数据通讯将使用的步骤⑤中的主密码为对称密钥,同时通知客户端服务器端的握手过程结束。
-
SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验。
- 缺点
- 握手阶段比较费时. 网页加载时间延长
- 缓存不如http高效, 会增加数据开销
- SSL证书需要钱
- SSL证书需要绑定IP, 不能在同一IP绑定多个域名
- 并非绝对安全, 有CA根证书和长我加密算法依旧可以进行中间人攻击
-
HTTP和HTTPS的区别
- HTTP传输的数据是未加密的,HTTPS是加密的
- HTTP使用80端口,HTTPS使用443端口
- HTTPS需要CA,证书授权中心的授权证书
- HTTPs 并不是新协议,而是 HTTP 先和 SSL(Secure Socket Layer)通信,再由 SSL 和 TCP 通信。通过使用 SSL,HTTPs 提供了加密、认证和完整性保护。
-
Cookie
Http协议是无状态的, 而Http/1.1引入了Cookie来保存状态信息;
- Set-Cookie字段有以下属性:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Y2Qr8E4-1590151948386)(http://p2e1umi3v.bkt.clouddn.com/18-3-9/69897260.jpg)] - Session和Cookie的区别
Session 是服务器用来跟踪用户的一种手段,每个 Session 都有一个唯一标识:Session ID。当服务器创建了一个 Session 时,给客户端发送的响应报文就包含了 Set-Cookie 字段,其中有一个名为 sid 的键值对,这个键值对就是 Session ID。客户端收到后就把 Cookie 保存在浏览器中,并且之后发送的请求报文都包含 Session ID。HTTP 就是通过 Session 和 Cookie 这两种方式一起合作来实现跟踪用户状态的,Session 用于服务器端,Cookie 用于客户端。
- Set-Cookie字段有以下属性:
-
缓存
有两种缓存方法:让代理服务器进行缓存和让客户端浏览器进行缓存。
Cache-Control 用于控制缓存的行为。Cache-Control: no-cache 有两种含义,如果是客户端向缓存服务器发送的请求报文中含有该指令,表示客户端不想要缓存的资源;如果是源服务器向缓存服务器发送的响应报文中含有该指令,表示缓存服务器不能对资源进行缓存。
Expires 字段可以用于告知缓存服务器该资源什么时候会过期。当首部字段 Cache-Control 有指定 max-age 指令时,比起首部字段 Expires,会优先处理 max-age 指令。
-
持久链接
- Http/1.0 之前默认是非持久化连接的, 如果要维持持续链接, 需要使用Keep-Alive
- Http/1.1 默认持久化连接, 通过Connection首字段进行管理.
-
Http各版本区别
-
HTTP/0.9
HTTP 0.9是第一个版本的HTTP协议,已过时。它的组成极其简单,只允许客户端发送GET这一种请求,且不支持请求头。由于没有协议头,造成了HTTP 0.9协议只支持一种内容,即纯文本。不过网页仍然支持用HTML语言格式化,同时无法插入图片。
HTTP 0.9具有典型的无状态性,每个事务独立进行处理,事务结束时就释放这个连接。由此可见,HTTP协议的无状态特点在其第一个版本0.9中已经成型。一次HTTP 0.9的传输首先要建立一个由客户端到Web服务器的TCP连接,由客户端发起一个请求,然后由Web服务器返回页面内容,然后连接会关闭。如果请求的页面不存在,也不会返回任何错误码。
-
HTTP/1.0
- 请求与响应支持头域
- 响应对象以一个响应状态行开始
- 响应对象不只限于超文本
- 开始支持客户端通过POST方法向Web服务器提交数据,支持GET、HEAD、POST5. 方法
- 支持长连接(但默认还是使用短连接),缓存机制,以及身份认证
-
HTTP/1.1
关键的性能优化: keepalive连接,chunked编码传输,字节范围请求,请求流水线等
- 请求消息和响应消息都应支持Host头域在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。因此,Host头的引入就很有必要了。
- 新增了一批Request method
HTTP1.1增加了OPTIONS,PUT, DELETE, TRACE, CONNECT方法
缓存处理 - HTTP/1.1在1.0的基础上加入了一些cache的新特性,引入了实体标签,一般被称为e-tags,新增更为强大的Cache-Control头。
-
HTTP/2.0
HTTP 2.0是下一代HTTP协议,目前应用还非常少。主要特点有:
-
多路复用(二进制分帧)
不会改动HTTP 的语义,HTTP 方法、状态码、URI 及首部字段,等等这些核心概念上一如往常,却能致力于突破上一代标准的性能限制,改进传输性能,实现低延迟和高吞吐量。而之所以叫2.0,是在于新增的二进制分帧层。在二进制分帧层上, HTTP 2.0 会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 ,其中HTTP1.x的首部信息会被封装到Headers帧,而我们的request body则封装到Data帧里面。
-
头部压缩[ 像来自同一个网页的图像,将会有大量的请求看上去几乎同样的,这就需要压缩技术对付这种几乎相同的信息。]
-
随时复位
-
服务器端推流: Server Push
-
优先权和依赖
-
-
参考文献
- 面试时,你被问到过 TCP/IP 协议吗? - CSDN博客 http://blog.csdn.net/yulyu/article/details/69062288
- preparation/Network.md https://github.com/lisongting/preparation/blob/26f7302dcc243aecfd363e1a31769946efc852f9/Network.md
- https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C.md
- TCP拥塞控制-慢启动、拥塞避免、快重传、快启动 - CSDN博客 http://blog.csdn.net/jtracydy/article/details/52366461
- https://github.com/CyC2018/Interview-Notebook/blob/66d63de8b875ff9be79763fb9bbed93f183403cb/notes/HTTP.md
- https加密流程和原理 - CSDN博客 http://blog.csdn.net/xincai/article/details/51954468