OSI七层模型
+ 物理层
+ 数据链路层
+ 网络层
+ 传输层
+ 会话层
+ 应用层
物理层
将0和1的比特流转换成物理介质。如果没有物理层,由 0 和 1 构成的比特流就无法在物理介质中传播。
数据链路层
它定义了通过通信介质相互连接的设备之前数据传输的规范.数据链路成的意义在意,如果没有数据链路层,数据只能以流的形式存在于通信介质中,不知道数据该发送到哪里。里面有2个重要的概念:
MAC地址
被烧录在网卡ROM中的一串数字,长度为48比特,他在世界范围内是唯一的。一旦指定了MAC地址,就确定了向哪个设备传输数据。
分组交换
分组交互就是将较大的数据分割成若干个较小的数据,然后依次发送。因为不同的数据链路有各自最大的传输单元(MTU),所以需要分割.以太网为例,它的MTU为100个字节,也就是通过以太网传输的数据必须分割为若干个帧,每个帧的大小不超过1500字节.
网络层
网络层的主要作用是实现终端节点间的通信。数据链路层的作用是实现在同一个数据链路下的传递,而网络层则可以实现跨越不同数据链路的包传递.比如主机A通过Wi-Fi连接到路由器B,路由器B通过以太网连接到路由器C,而路由器C又通过Wi-Fi与主机D保持连接。这时主机A向D发送的数据包就依赖于网络层进行传输。
IP协议
IP协议可以分为三大作用模块:IP寻址,路由和IP分包.
IP地址
IP地址是一个在网络层用于识别通信端信息的地址.
DNS解析
IP地址用于识别双方的地址,但他是一长串数字,不好记忆,于是诞生了域名。DNS协议的作用就是将域名转换成IP。
ARP协议
ARP协议用于通过目标IP地址定位到下个接受数据的网络设备的MAC地址ARP 协议的工作原理可以分为两部分:ARP 请求和 ARP 响应。 首先,源主机会通过广播发送一个 ARP 请求包:“我要与 IP 地址为 xxx 的主机通话,谁知道它的 MAC地址?”。
数据链路上的所有主机都会收到这条消息并检查自己的 IP 地址,如果与 ARP 请求包中的 IP 地址一致,主机就会发送 ARP 响应包:“我就是 IP 地址为 xxx 的主机,我的 MAC 地址是:xxxx”。
传输层
传输层的主要作用是实现应用程序间的通信。网络层主要保证了不同数据链路下的数据可达性,至于如果传输数据由传输层负责。常见的传输层协议有TCP协议和UDP协议。TCP协议是面向有链接的协议.也就是说使用TCP协议传输数据之前一定要在发送发和接收方建立连接。一般情况下,建立连接需要3步,关闭连接需要4步。
建立 TCP 连接后,由于有数据重传、流量控制
等功能,TCP 协议能够正确处理丢包问题,保证接收方能够收到数据,与此同时还能够有效利用网络带宽。然而 TCP 协议中定义了很多复杂的规范,因此效率不如 UDP 协议,不适合实时的视频和音频传输。
UDP协议是面向无连接的协议。可能会丢失数据.
IP 协议中的两大关键要素是源 IP 地址和目标 IP 地址。而刚刚我们说过,传输层的主要作用是实现应用程序之间的通信
。因此传输层的协议中新增了三个要素:源端口号,目标端口号和协议号。通过这五个信息,可以唯一识别一个通信。
不同的端口用于区分同一台主机上不同的应用程序。假设你打开了两个浏览器,浏览器 A 发出的请求不会被浏览器 B 接收,这就是因为 A 和 B 具有不同的端口。
TCP三次握手
Q:为什么是三次握手呢?
因为网络是不可靠的,可能存在延迟或者丢包的可能。三次握手保证了连接的可靠性。举个例子:
假设没有第三次确认,客户端向服务端发送了 SYN,请求建立连接。由于延迟,服务端没有及时收到这个包。于是客户端重新发送一个 SYN 包。回忆一下介绍 TCP 首部时提到的序列号,这两个包的序列号显然是相同的。
假设服务端接收到了第二个 SYN 包,建立了通信,一段时间后通信结束,连接被关闭。这时候最初被发送的 SYN 包刚刚抵达服务端,服务端又会发送一次 ACK 确认。由于两次握手就建立了连接,此时的服务端就会建立一个新的连接,然而客户端觉得自己并没有请求建立连接,所以就不会向服务端发送数据。从而导致服务端建立了一个空的连接,白白浪费资源。
#######三次握手建立连接
这个过程可以用以下三句形象的对话表示:
- (客户端)我要建立连接了。
- (服务端)我知道你要建立连接了,我这边没有问题。
- (客户端)我知道你知道我要建立连接了,接下来我们就正式开始通信。
四次握手关闭连接
这个过程可以用以下四句形象的对话表示:
- (客户端)我要关闭连接了。
- (服务端)你那边的连接可以关闭了。
- (服务端)我这边也要关闭连接了。
- (客户端)你那边的连接可以关闭了。
由于连接是双向的,所以双方都要主动关闭自己这一侧的连接。#
Q:TCP与UDP区别
- tcp是面向有连接的,它具有丢包重发和流量控制的功能,这是他与UDP最大的区别.udp无连接
- udp可能会丢失数据
TCP特色之 数据重发
丢包重发的前提是发送方知道了接收方是否成功地接受到了消息。所有,接受端会返回一个确认应答(ACK)的通知,这表示收到了数据包.
发送方如果在一段时间内没有收到 ACK,就会重发数据:
即使网络连接正常,由于延迟的存在,接收方也有可能收到重复的数据包,因此接收方通过 TCP 首部中的 SYN 判断这个数据包是否曾经接收过。如果已经接收过,就会丢弃这个包。
应用层
HTTP协议位于最顶层的应用层里面.使用HTTP协议的时候,客户端会先于服务器的80端口简历一个tcp连接,然后在这个连接的基础上进行请求和应答。
HTTP有两个常用的版本,分别是1.0和1.1。1.0每次请求和应答都会使用一个新的TCP连接,而HTTP1.1在一个连接上进行请求和应答。
POST请求和GET请求
他们的却别:
- GET请求可以被缓存,可以被收藏为书签,post不行
- GET请求会保留在浏览器的历史记录中,post不会.
- GET请求的长度有限制,URL的数据只能是ACSII字符,POST没有限制.
- GET请求的参数都在URL中,而POST则放在HTTP的请求头里面,安全性高于GET。
Cookie和Session
HTTP 是一种无状态的连接,客户端每次读取 web 页面时,服务器都会认为这是一次新的会话。但有时候我们又需要持久保持某些信息,比如登录时的用户名、密码,用户上一次连接时的信息等。这些信息就由 Cookie 和 Session 保存。
这两者的根本性区别在于,cookie 保存在客户端上,而 session 则保存在服务器中。由此我们还可以拓展出以下结论:
- cookie 相对来说不安全,浏览器可以分析本地的 cookie 进行 cookie 欺骗。
- session 可以设置超时时间,超过这个时间后就失效,以免长期占用服务端内存。
- 单个 cookie 的大小有限制(4 Kb),每个站点的 cookie 数量一般也有限制(20个)。
- 客户端每次都会把 cookie 发送到服务端,因此服务端可以知道 cookie,但是客户端不知道 session。
当服务器接收到 cookie 后,会根据 cookie 中的 SessionID 来找到这个客户的 session。如果没有,则会生成一个新的 SessionID 发送给客户端。
HTTPS
我们知道 HTTP 协议直接使用了 TCP 协议进行数据传输。由于数据没有加密,都是直接明文传输,所以存在以下三个风险:
窃听风险:第三方节点可以获知通信内容。
篡改风险:第三方节点可以修改通信内容。
冒充风险:第三方节点可以冒充他人身份参与通信。
总结一下 HTTPS 协议是如何避免前文所说的三大风险的:
- 先用非对称加密传输密码,然后用这个密码对称加密数据,使得第三方无法获得通信内容
- 发送方将数据的哈希结果写到数据中,接收方解密后对比数据的哈希结果,如果不一致则说明被修改。由于传输数据加密,第三方无法修改哈希结果。
- 由权威机构颁发证书,再加上证书校验机制,避免第三方伪装参与通信。
现在 HTTPS 协议的握手阶段变成了四步:
- 客户端: 你好,我要发起一个 HTTPS 请求,请给我公钥
- 服务器: 好的,这是我的证书,里面有加密后的公钥
- 客户端: 解密成功以后告诉服务器: 这是我的 (用公钥加密后的) 对称秘钥。
- 服务器: 好的,我知道你的秘钥了,后续就用它传输。