OSI七层模型
每一层都专注做一件事情:每一层都需要使用下一层提供的功能为上一层提供服务
- 物理层利用传输介质,为数据链路层提供支撑实现各个节点之间的比特流数据传输;
- 数据链路层负责管理节点与节点之间的数据通信;
- 以太网协议:一组电信号构成一个数据包,我们把这个数据包称之为帧。每一个帧由标头和数据两部分组成
- MAC地址:每一个计算机都会有一个网卡接口,每一个网卡都会有唯一的地址。
- 网络层负责网络的路由与转发,保证各个主机之间的数正常通信;
- IP协议:IPV4(提供2^(48=32)个IP地址)和IPV6(提供2^(68)个IP地址)。IPV4由两部分组成:一部分代表网络部分;一部分代表主机部分,且网络部分和主机部分所占用的二进制位数是不同的。加入两天计算机的网络部分是一样的,则说明他们是在一个子网中。怎么区分呢?——子网掩码。例如255.255.255.0;表示在这个子网中的前三段都是相同的。192.168.43.1和192.168.43.2的子码掩码都为255.255.255.0,把IP与子码掩码相与,可以得到他们都为192.168.43.0,进而他们处于同一个子网中。
- ARP协议
- 传输层在网络层的基础上为两台主机进程间通信提供通用的数据传输服务;
- TCP和UDP协议
- 会话层负责管理应用程序之间的会话
- 表示层负责数据处理(编解码,解压缩,加解密)
- 应用层为计算机用户提供定制化服务
TCP/IP四层模型
应用层
应用层位于传输层之上,利用传输层提供的进程间通用数据传输功能,为两台终端设备上的应用程序提供信息交换的服务,它定义了信息交换的格式,消息会交给下一层传输层来传输。应用层交互的数据单元称为报文。
主要协议:HTTP、DHCP、DNS、SSH、SMTP
传输层
传输层主要任务就是负责向两台终端设备进程之间的通信提供通用的数据传输服务。
TCP:传输控制协议——提供面向连接的可靠的数据传输服务
UDP:提供无连接的尽最大努力的数据传输服务(不保证数据传输的可靠性)
网络层
网络层负责分分组交换机网络上的不同主机提供通信服务,在发送数据时,网络层把传输层产生的报文段或用户数据报封装成分组和包进行传送。在TCP/IP体系结构中,由于网络层使用IP协议,因此分组也叫IP数据报,简称数据报。
注意不要把UDP用户数据报和网络层IP数据报搞混淆
网络层还有一个任务就是选择合适的路由,使源主机运输层所传下来的分株,能过够通过网络层中的路由器找到目的主机。
IP网际协议和路由转发协议
网络接口层
可以把网络接口层看作是数据链路层和物理层的合体。
- 数据链路层:通常简称为链路层(两台主机之间的数据传输,总是在一段一段的链路上传输的)。数据链路层的任务是将网络层传下来的IP数据报组装成帧,在两个相邻的节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制信息等)
物理层的作用是实现相邻计算机节点之间比特流的透明传输,尽可能屏蔽掉具体传输介质和物理设备的差异。
为什么要分层?
复杂的系统需要分成,因为每一层都需要专注于一类事情。
各个层之间相互独立,各层之间不需要关心其他层是如何实现的,只需要知道自己如何调用下层提供的服务就可以了。
- 提高整体灵活性,每一层都可以灵活的使用最适合的技术,只需要保证你提供的功能以及暴露的接口规则没有改变就行。
- 大问题小化:分层可以将复杂的问题分解称比较小的,界限比较明确的小问题来处理。
应用层
报文
请求报文结构
- 第一行:请求方法 URL 协议版本号
- 接下来的多行:请求首部Header,每个首部都是一个首部名称:对应的值
- 一个空行来分隔请求首部和请求体
-
响应报文
第一行:协议版本号 状态码以及描述
- 接下来多行也是首部内容
- 一个空行分隔首部和响应体
- 响应体
HTTP1.0和2.0的区别
HTTP/1.0
http 1.0规定客户端和服务器每次之保持短暂的连接,即每发起依次请求就需要建立一次连接,进行三次握手和四次挥手的过程。
连接无法复用HTTP/1.1
- 引入持久连接,即每次请求完毕后,连接默认不关闭,可以被多个请求复用
- 引入管道机制,即在同一个TCP连接里,客户端可以发起多次请求。注意是串行的
加入服务推送功能,服务端将一些客户端能够请求到的资源提前推送到客户端的缓存中
HTTP/2.0
- 引入多路复用,即客户端在一次连接中可以同时发起多次请求,且请求可以并行的执行
多路复用的前提,2.0引入了二进制帧。在1.x版本中,HTTP是基于文本传输的协议,文本传输存在天然的缺陷,文本具有多样性。二进制则不同,只认0和1,增加了健壮性
-
GET和POST的区别
使用场景:GET用于获取资源,而POST用于传输实体
- 参数:GET请求的参数放在请求行里(URL),POST请求放在请求体中
- 安全性:安全性指的是HTTP方法不会改变服务器的状态,也就是说他只是可读的
因此GET方法是安全的,POST方法是不安全的,会对服务器数据库造成改变
安全的方法还有:GET、HEAD、OPTIONS
不安全的方法:POST、PUT、DELETE
- 幂等性:执行一次和执行多次的结果是一样的。所以GET、HEAD、PUT、DELETE都具有幂等性,而POST不具有幂等性
GET 的语义是从服务器获取指定的资源 POST 的语义是根据请求负荷(报文body)对指定的资源做出处理
HTTP常见的状态码
- 1xx:表示目前是协议的中间状态,还需要后续请求
- 101:切换请求协议,从HTTP写换到WebSocket
- 2XX:表示请求成功
- 200:请求成功,有响应体
- 3XX:表示重定向状态,需要重新请求
- 301:永久重定向:会缓存
- 302:临时重定向:不会缓存
- 304:协商缓存命中
- 4XX:请求报文错误
- 403:服务器禁止访问
- 404:资源未找到
- 400:请求错误
- 5XX服务器端发生错误
- 500服务端错误
- 503服务器繁忙
GET方法中为什么采用URL编码
避免歧义,比如传递“name=va&ue=e”HTTP(80)与HTTPS(443)的区别
HTTP运行在TCP上面裸奔,明文传输,客户端与服务器端都无法验证各自的身份。HTTPS是身披SSL(Secure Socket Layer)外壳的Http,运行在SSL上,SSL运行在TCP上,是添加了加密和认证的HTTP。加密
1. 对称加密
加密和解密采用同一密钥,运行速度快,但是无法安全地将密钥传输给通信方。
2. 非对称加密
加密和解密使用不同的密钥
公开加密,所有人都可以获得,通信发送方获得接收方的公开密钥后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。
非对称加密除了用来加密,还可以用来进行签名。因为私有密钥无法被其他人获取,因此通信发送方使用其私有密钥进行签名,通信接收方使用发送方的公开密钥对签名进行解密就能判断这个签名是否正确。
数字签名和认证
- 数字签名
数字签名技术就是将原文通过特定的hash函数得到一个摘要信息(原文的哈希值),再用CA的私钥进行加密得到(数字签名),并将这个摘要信息原文一起打包(数字证书)发送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息。
- 数字认证
客户端收到数字签名后,使用CA的公钥,向CA验证数字证书上的数字签名,已确认服务器的公钥的真实性(没有被修改)
Https采用的加密方式和加密过程
加密过程
- 客户端发起一个http请求,告诉服务器自己支持哪些哈希算法
- CA(数字认证中心)用自己的私钥把服务器的公钥(就是原文信息)用hash算法生成消息摘要,使用CA的私钥对消息摘要进行加密得到数字签名,将数字签名和原始信息(公钥)合并得到数字证书发送给接收者(服务器)
- 进行https通信时,服务器会把数字证书发送给客户端,客户端收到证书后,使用公钥对数字前面进行验证,如果验证通过,就可以使用该公钥了。
- 客户端生成一个随机字符串session key,然后用服务器的公钥进行加密,发送给服务器,服务器用密钥进行解密。
- 之后传输都用刚才那个随机字符串进行对称解密。
对称加密和非对称加密的区别
- 通过非对称加密来加密和获取对称加密的密钥
- 通过非对称加密完成数字证书的验证过程
-
HTTP协议
HTTP协议全称超级文本传输协议,顾名思义就是用来规范超文本的传输,超文本也就是网络包括在内的各式各样的消息,具体来说就是规范浏览器端与服务器端的行为的。
HTTP 是一种无状态协议。HTTP通信过程
服务器端在80端口等待客户端的请求。
- 浏览器发起到服务器的TCP连接(创建套接字Socket)
- 服务器接收来自浏览器的TCP连接
Web应用的请求过程(在浏览器输入一个地址到请求页面的过程)
https://blog.csdn.net/sun927/article/details/50764837
1. DHCP配置主机信息
假设客户端目前还没有IP地址,这个时候如何动态获取IP地址呢?
通过运行DHCP协议,动态主机配置。以从本地的DHCP服务器获取一个IP地址以及其他信息(IP地址,DNS服务器IP地址、默认网关路由器的IP、子网掩码)
客户端计算机上的操作系统生成一个IP数据报,并将这个数据包放入目的端口67,源端口68的UDP报文段中,因为此时客户机没有IP地址,因此将该UDP报文段放置在目的IP255.255.255.255地址和源IP0.0.0.0的IP数据报当中。
该IP数据报被放置在以太网帧当中,目的MAC地址为FF:FF:FF:FF::FF:FF,使该帧将广播到与交换机连接的所有设备,源MAC地址是知道的假设为00:16:D3:23:68:8A(客户机MAC地址)。
路由器在他的接口接收到该广播的以太网帧,该帧包含DHCP请求,并且从该以太网帧中抽取出IP数据报。该数据报的广播IP目的地址指示了这个IP数据报应当由在该节点的高层协议处理,因此该数据报的载荷被分解向上到达UDP,从此UDP报文段中抽取出DHCP请求报文段。
运行在路由器的DHCP接收到来自客户端的DHCP请求报文段后,DHCP会生成一个DHCP ACK响应报文,包含:IP地址,DNS服务器的IP,默认网关路由器(第一跳路由)子网掩码
客户端接收到包含DHCP ACK的以太网帧,从以太网帧中抽取IP数据报,从IP数据报中抽取UDP报文段,从UDP报文段中抽取DHCP ACK的响应报文并记录下本机的IP地址和DNS服务器的IP地址
DHCP协议
一个局域网的网络协议,使用UDP协议工作,统一使用IANA分配端口:67(服务器端口)68(客户端端口)。
DHCP常被用于局域网环境,主要作用是集中的管理分配IP地址,使client动态获取IP地址,gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。简单来说,DHCP就是一个不需要账号密码登陆的,自动给内网机器分配IP地址等信息的协议。
原理:
- DHCP服务发现:在UDP分组中向端口67发送一个DHCP发现报文。但这个时候DHCP客户端不知道发送给谁,采用广播的形式。目的地址为广播IP地址255.255.255.255,源地址为0.0.0.0。
- DHCP服务器提供,当DHCP服务器收到一个DHCP发现报文时,用一个DHCP提供报文向客户端做出相应,任然使用IP广播地址255.255.255.255
- DHCP请求:客户机从一个或多个服务器提供中选择一个,并向选中的服务器提供DHCP请求报文
- DHCP ACK:服务器用DHCP ACK报文对客户机的请求报文进行响应。该报文段包含一下信息:IP地址、DNS服务器的IP地址、默认网关路由器的IP地址和子网掩码
其地址分配方式有如下三种
- 人工配置:由管理员对每台具体的计算机指定一个地址
- 自动配置:服务器为第一次连接网络的计算机分配一个永久地址,DHCP客户端第一次成功地从DHCP服务器端分配到一个IP地址之后,就永远使用这个地址
- 动态配置:在一定的期限内将地址租给计算机,客户端第一次从DHCP服务器分配到IP地址后,并非永久地使用该地址,每次使用完后,DHCP客户端就得释放这个IP地址,并且租期结束后客户必须续租或者停用该地址,而对于路由器,经常使用的地址分配方式是动态配置。
2.ARP和DNS
当客户端将www.google.com的URL键入其Web浏览器时,他开启了一长串事件,这导致Google主页最终显示在其Web浏览器上。Bob 的Web浏览器通过生成一个TCP套接字开始了该过程,套接字用于向www.google.com发送HTTP请求。为了生成套接字,Bob计算机需要知道谷歌服务器的IP地址,这就需要DNS协议将这种域名解析为IP地址。
Bob计算机操作系统,生成一个DNS查询报文,将字符串www.google.com放入DNS查询报文的问题段中。该DNS报文则放置在具有53号目的端口的UDP报文段中,该UDP报文段则被放置在IP地址为DNS IP的IP数据报中(目的IP为客户机,源IP为DNSIP)。
Bob客户机将包含DNS请求报文的数据报放入一个以太网帧中,将该帧发送到学校默认网关路由器,但是Bob计算机只知道默认网关路由器的IP地址,但不知道默认网关路由器的MAC地址,因此需要ARP协议将默认网关的IP地址解析为MAC地址。ARP解析MAC地址
Bob计算机生成一个包含对IP地址为xxx的ARP查询报文放入到一个具有广播目的地址的以太网帧中,冰箱急缓激发送该以太网帧,交换机将该帧交付给所有连接的设备,包括网关路由器。
网关路由器在通往学校的接口上收到包含该ARP查询的报文段的帧,发现其目标IP与其接口IP相同,网关路由器此时准备一个ARP回答,只是客户端IP地址对应的MAC地址。它将ARP地回答放入到一个以太网帧中,其目的地址为客户端的MAC地址。Bob计算机收到该包含ARP报文的帧后,在ARP报文中抽取默认网关路由器的MAC地址并在本地ARP表中创建一条新的记录。DNS解析域名(53号端口)
此时包含DNS查询报文的以太网帧终于到了网关路由器,路由器从该以太网帧中抽取包含DNS查询报文的IP数据报,路由器根据IP地址查询路由转发表,最终将该数据报转发到DNS对应的路由网口,
最终包含DNS查询报文的IP数据报到达DNS服务器,DNS服务器从IP数据报中抽取出包含DNS查询报文的DNS查询报文。在他的DNS数据库中查询域名为www.google.com的IP地址,找到包含该域名的DNS源记录。该DNS服务器形成了一个包含这种域名到IP地址映射的DNS回答报文放入UDP报文段中,。DNS经过反向转发给Bob客户端计算器。
经过大量工作后Bob终于得到了谷歌服务器的IP地址,并可以和谷歌服务器简历通信了。4.Web客户端——服务器交互:TCP与HTTP
Bob计算机有了www.google.com的IP地址后就可以生成TCP套接字了,该套接字用于向www.google.com发送HTTP 请求报文。当Bob生成TCP套接字时,在Bob计算机中的TCP必须首先与谷歌服务器中的TCP执行三次握手。
具体为:
bob计算机向谷歌服务器发送一个TCP SYN的报文段
Bob接收到该报文段后产生一个TCP SYNACK报文段
此时建立好了TCP连接
Bob终于可以向www.google.com发送请求了。
Bob的Web浏览器生成HTTP GET报文,HTTP报文则写入套接字,其中GET报文称为一个TCP报文段的载荷,该TCP报文被放进一个数据报中,并交付到www.google.com
谷歌服务器收到请求报文后生成一个HTTP响应报文,将请求的Web页面内容放入HTTP响应体中。并将报文发送进TCP套接字中。包含HTTP响应报文的数据报经过路由转发,到达Bob计算机。Bob的Web浏览器从套接字中读取HTTP响应,从HTTP响应体中抽取Web页面的HTML,最终渲染出页面效果。
DNS
DNS的解析过程
- 本机向本地域名服务器的查询一般都是递归查询:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户端的身份,向根域名服务器继续发起查询请求报文,然后将查询结果发送给主机。
- 本地域名服务器向根域名服务器的查询是迭代查询:当当前跟域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应该向哪一个域名服务器进行查询”。然后本地域名服务器进行后续查询,知道迭代遍历到目标域名的IP地址。将结果返回给主机。
传输层
三次握手
简单的理解三次握手的本质: 第一次握手:客户端给服务器端发送一个SYN报文 第二次握手:服务器端收到SYN报文之后,会应答一个SYN+ACK报文; 第三次握手:客户端收到SYN+ACK报文段后,会回应一个ACK 当服务器端收到客户端的ACK后,三次握手建立完成。
三次握手的过程:
- 首先客户端处于closed状态,服务器处于Listen(监听状态)
- A向B发送连接的请求报文,SYN=1,ACK=0,初始化一个序号x;此时客户端处于SYN_SEND状态
- B收到来自A的请求后,如果同意建立连接,则向A发送连接确认报文,SYN=1,ACK=1,确认号为x+1(为啥是X+1呢?防止网络连接超时等原因导致的请求重发),同时在初始化一个需要y;此时服务器处于SYN_RCVD状态
- A收到B的连接确认报文后,还要向B发出确认,确认号为y+1,序号为X+1;此时客户端属于established状态
- B收到A的确认后,连接建立。此时服务器段处于established状态。
为什么是三次握手?
建立连接的目的实际上是为了让客户端和服务器端确认自己和双方的接收能力。实际上就是通过三次握手将下表填完整:
三次握手可以携带数据么?
在第三次握手的时候是可以携带数据的,因为当完成第二次握手后,客户端已经可以确定源端的接发正常,目的端接发正常。四次挥手
- 第一次挥手:客户端发送一个FIN报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT状态。
- 第二次挥手:服务端收到FIN之后,会发送ACK报文,且把客户端的序列号值+1作为ACK报文的序列号值,表明已经收到客户端的报文了,此时服务端处于CLOSED_WAIT状态。
- 第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给客户端FIN报文,且指定一个序列号。此时服务端处于LAS_ACK状态
- 第四次挥手:客户端收到FIN之后,一样发送一个ACK报文作为应答,且把服务端的序列号值+1作为自己ACK报文的序列号值,此时客户端处于TIME_WAIT状态。需要过一阵子以后确保服务端收到自己的ACK报文之后才会进入CLOSED状态。、
- 服务端收到ACK报文后,就处于关闭状态,处于CLOSED状态。
为什么客户端不在发送完ACK报文之后直接进入CLOSED状态?
确保服务器已经收到ACK报文,如果没有收到的话,服务器会重发一个FIN报文,客户端再次收到FIN报文的时候,就知道服务器没有收到上次的ACK报文,因此会重新发送ACK报文。TIME_WAIT的时间是多久?
一般设置为一个报文来回的时间(2个MSL)。为啥是两个MSL?
为了保证发送者的最后一个ACK报文能够到达接收方。
TCP与UDP的区别
TCP协议的主要特点:
- TCP协议是面向连接的传输协议:所谓面向连接,就是双方在传输数据之前,必须建立一个推导,例如三次握手就是建立通道的过程,而四次挥手则是销毁通道的过程。
- 每一条TCP连接只能有两个端点(即两个套接字),只能是点对点;
- TCP提供的是可靠的传输服务,传送的数据是无差错的、不允许丢失、不重复,按序到达的;
- TCP提供全双工通信。允许通信双方的应用进程在任何时候都可以发送数据,因为两端都没有发送缓存和接收缓存。
- 面向字节流传输。
-
TCP的可靠性原理:
传输信道无差错,保证传输数据的正确性
- 不断发送方以多块的速度发送数据,接收方总是来得及处理收到的数据;
- UDP是无连接的传输协议
- UDP使用尽最大努力交付,不保证可靠性
- UDP是面向报文的,对应用层交下来的报文,不合并,不拆分,保留原报文的边界
- UDP没有拥塞控制,因此及时网络出现拥塞也不会降低发送速率
- UDP支持一对多,多对一多对多
-
TCP与UDP的区别
TCP是面向连接的,UDP是面向无连接的
- TCP是可靠传输、UDP是尽最大努力交付
- TCP是有序的,UDP不保证有序性
- TCP不保存数据边界,以字节流发送,UDP保留数据边界
- TCP相对UDP要慢一些
- TCP有流量控制,UDP没有
- TCP首部20字节,UDP首部8字节
常见基于TCP的协议:HTTP,TELNET,FTP,SMTP
常见基于UDP的协议:DHCP,ARP,DNS
TCP可靠性的保证(重点回答拥塞控制)
- TCP是面向连接的,即每次通信前都会进行三次握手建立连接的过程。来保证通信信道是可靠的
- TCP采用ARQ协议(自动超时重传)保证数据的正确性
- 再次,TCP采用慢开始、拥塞避免、快重传、快恢复的拥塞控制策略
- 数据报校验:若检测有错,会丢弃数据报,不给出回应,等待超时重传
- 失序数据报重排序
- 丢弃重复数据
- 应答机制
- 超时重发
- 流量控制(拥塞控制)
- 停止等待:是为了实现可靠传输,基本原理就是每发完一个分组,就等待对方确认,在收到确认后再发下一个分组。(滑动窗口实现的时候,滑动窗口内部的数据发送可以不用等待收到确认再发送下一个,有一个缓冲区的概念)
拥塞控制原理
慢开始、拥塞避免、快重传、快恢复
发送方有一个拥塞窗口(cwnd),和一个发送窗口(此时可发送的数据包大小),还有一个慢开始门限(ssthresh)
- 假设开始cwnd=1,而发送窗口swnd=cwnd=1;因此发送端向接收端发送一个数据包。接收端收到一个数据包后,传给响应端一个ACK确认报文,发送端收到确认报文的数量为1。
- 此时cwnd=上一次cwnd+ack确认报文的数量=2=swnd。此时发送端向接收端发送2个报文,接收端收到两个报文后,给发送端2个确认报文。
- 此时cwnd=2+2=4。。以此类推,发送端的发送窗口以指数增长,知道cwnd>sstresh。发送端改用拥塞避免算法
2.拥塞避免算法
假设sstresh=16,当cwnd=16时,改用拥塞避免算法。这次发送端收到来自于接收端的确认报文后就不是指数背的增加了。而是线性加1,比如下次就是向接收端发送16+1个报文,如果这次成共,下次发送17+1个报文。 直到增加到某一时刻(假设此时cwnd=24)发生数丢失。此时就需要更改cwnd和sstresh(慢开始门限),并重新开始慢开始算法。
如果直接进入慢开始会有问题:
因此引入快速重传和快恢复3. 快速重传
发送方发送1号数据报给接收端,接收端回复确认1号;
发送方在收到1号的确认回复之前,接着发送方发送2号数据报,接收端回复2号;
发送方在收到2号确认报文之前,接着发送3号数据报,,,
此时假设2号确认报文因为网络等原因丢失,发送方没有收到2号的确认报文,而直接收到了3号确认报文,此时发送方会发送对2号的重复确认,并发送4号的接收报文。 此时收到了4号的确认报文,不是想要的2号确认报文。此时会再次发送对2号的确认报文,并发送5号的接收报文。
此时网络恢复正常,接收端因为收到了三个2号的请求报文,因此接收到立即向发送方发送3个针对于2号的确认报文。接收方收到后,立即重传6号确认报文。保证了数据不丢失和有序性
4. 快恢复
发送方出现网络拥塞时,发现只是丢失了个别数据,于是并不启动慢开始算法,而执行快恢复算法