1.网络协议是什么?
在计算机网络要做到有条不紊地交换数据,必须遵守一些事先约定好的规则, 比如交换数据的格式、是否需要发送一个应答信息。这些规则被称为网络协议。
2.为什么要对网络协议分层?
一,简化问题难度和复杂度。由于各层之间独立,我们可以分割大问题为小问题。
二,灵活性好。当其中一层的技术变化时,只要层间接口关系保持不变,其他层不受 影响。
三,易于实现和维护。
四,促进标准化工作。分开后,每层功能可以相对简单地被描述。
网络协议分层的缺点: 功能可能出现在多个层里,产生了额外开销。 为了使不同体系结构的计算机网络都能互联,国际标准化组织
ISO
于
1977
年提出了一个试图使各种计算机在世界范围内互联成网的标准框架,即著名的开放系统互联基本参考模型 OSI/RM
,简称为
OSI
。
3.TCP/IP
四层体系结构。
TCP/IP
协议族
应用层
( application-layer
)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。
对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统
DNS
,支持万维网应用的
HTTP
协议,支持电子邮件的
SMTP
协议等等。
运输层
(transport layer)
的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。 运输层主要使用一下两种协议
1.
传输控制协议
-TCP
:提供面向连接的,可靠的数据传输服务。
2.
用户数据协议
-UDP
:提供无连接的,尽大努力的数据传输服务(不保证数据传输的可靠性),数据的可靠性由应用层保证。
![](https://i-blog.csdnimg.cn/blog_migrate/495b4632a5e456c673f57f9b1f5af721.png)
网络层的任务就是选择合适的网间路由和交换结点,确保计算机通信数据及时传送。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用
IP
协议,因此分组也叫
IP
数据报 ,简称数据报。
互联网是由大量的异构(
heterogeneous
)网络通过路由器(
router
)相互连 接起来的。互联网使用的网络层协议是无连接的网际协议(
Intert Prococol
)和许多路由选择协议,因此互联网的网络层也叫做网际层或 IP
层。
数据链路层
(data link layer)
通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。
在两个相邻节点之间传送数据时,数据链路层将网络层交下来的
IP
数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息 (如同步信息,地 址信息,差错控制等)。 在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。
物理层上所传送的数据单位是比特。 物理层
(physical layer)
的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。“
透明传送 比特流
”
表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说, 这个电路好像是看不见的。
4.TCP的三次握手四次挥手
TCP
报文的头部结构如下:
(1)序号:
seq
序号,占
32
位,用来标识从
TCP
源端向目的端发送的字节流, 发起方发送数据时对此进行标记。
(2)确认序号:
ack
序号,占
32
位,只有
ACK
标志位为
1
时,确认序号字段才有 效,
ack=seq+1
。
(3)标志位:共
6
个,即
URG
、
ACK
、
PSH
、
RST
、
SYN
、
FIN
等,具体含义如 下:
ACK
:确认序号有效。
FIN
:释放一个连接。
PSH
:接收方应该尽快将这个报文交给应用层。
RST
:重置连接。
SYN
:发起一个新连接。
URG
:紧急指针(
urgent pointer
)有效。
什么是三次握手?
第一次握手:客户端要向服务端发起连接请求,首先客户端随机生成一个起始序列号
ISN(
比如是
100)
,那客户端向服务端发送的报文段包含
SYN
标志位
(
也就是
SYN=1)
,序列 号seq=100
。
第二次握手:服务端收到客户端发过来的报文后,发现
SYN=1
,知道这是一个连接请求,于是将客户端的起始序列号
100
存起来,并且随机生成一个服务端的起始序列号
(
比如是300)
。然后给客户端回复一段报文,回复报文包含
SYN
和
ACK
标志
(
也就是
SYN=1,ACK=1)
、序列号
seq=300
、确认号
ack=101(
客户端发过来的序列号
+1)
。
第三次握手:客户端收到服务端的回复后发现
ACK=1
并且
ack=101,
于是知道服务端已经收到了序列号为
100
的那段报文;同时发现
SYN=1
,知道了服务端同意了这次连接,于是就将服务端的序列号300
给存下来。然后客户端再回复一段报文给服务端,报文包含
ACK
标志位
(ACK=1)
ack=301(
服务端序列号
+1)
、
seq=101(
第一次握手时发送报文 是占据一个序列号的,所以这次seq
就从
101
开始,需要注意的是不携带数据的
ACK
报文是不占据序列号的,所以后面第一次正式发送数据时
seq
还是
101)
。当服务端收到报文后发现ACK=1
并且
ack=301
,就知道客户端收到序列号为
300
的报文了,就这样客户端和服务端通过
TCP
建立了连接。
什么是四次挥手?
比如客户端初始化的序列号
ISA=100
,服务端初始化的序列号
ISA=300
。
TCP
连接成功后客户端总共发送了
1000
个字节的数据,服务端在客户端发
FIN
报文前总共回复了
2000
个字节的数据。
第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文
(
当然数据没发完时也可以发送连接释放报文并停止发送数据
)
,释放连接报文包含FIN标志位 (FIN=1)、序列号
seq=1101(100+1+1000,其中的1
是建立连接时占的一个序列号
)
。需要注意的是客户端发出
FIN
报文段后只是不能发数据了,但是还可以正常收数据;另外
FIN报文段即使不携带数据也要占据一个序列号。
第二次挥手:服务端收到客户端发的
FIN
报文后给客户端回复确认报文,确认报文包含
ACK
标志位
(ACK=1)
、确认号
ack=1102(
客户端
FIN
报文序列号
1101+1)
、序列号 seq=2300(300+2000)。此时服务端处于关闭等待状态,而不是立马给客户端发
FIN
报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。
第三次挥手:服务端将最后数据
(
比如
50
个字节
)
发送完毕后就向客户端发出连接释放报文,报文包含
FIN
和
ACK
标志位
(FIN=1,ACK=1)
、确认号和第二次挥手一样
ack=1102,
序列号seq=2350,(2300+50)
。
第四次挥手:客户端收到服务端发的
FIN
报文后,向服务端发出确认报文,确认报文包含
ACK
标志位
(ACK=1)
、确认号
ack=2351
、序列号
seq=1102
。注意客户端发出确认报文后不是立马释放TCP
连接,而是要经过
2MSL(
最长报文段寿命的
2
倍时长
)
后才释放
TCP
连接。而服务端一旦收到客户端发出的确认报文就会立马释放
TCP
连接,所以服务端结束TCP
连接的时间要比客户端早一些。
5.为什么
TCP
连接的时候是
3
次?
2
次不可以吗?
因为需要考虑连接时丢包的问题,如果只握手
2
次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数
据(
可以理解服务端已经连接成功
),而客户端一直没收到服务端的确认报文,所以客户端就不知道服务端是否已经准备好了(可以理解为客户端未连接成功
)
,这种情况下客户端不会给服务端发数据,也会忽略服务端发过来的数据。
如果是三次握手,即便发生丢包也不会有问题,比如如果第三次握手客户端发的确认
ack
报文失,服务端在一段时间内没有收到确认
ack
报文的话就会重新进行第二次握手,也就是服务端会重发SYN
报文段,客户端收到重发的报文段后会再次给服务端发送确认
ack
报文。
6.为什么
TCP
连接的时候是
3
次,关闭的时候却是
4
次?
因为只有在客户端和服务端都没有数据要发送的时候才能断开
TCP
。而客户端发出
FIN
报文时只能保证客户端没有数据发了,服务端还有没有数据发客户端是不知道的。而服务端收到客户端的FIN
报文后只能先回复客户端一个确认报文来告诉客户端我服务端已经收到你的
FIN
报文了,但我服务端还有一些数据没发完,等这些数据发完了服务端才能给客户端发FIN
报文
(
所以不能一次性将确认报文和FIN报文发给客户端,就是这里多出来了一次
)
。
7.为什么客户端发出第四次挥手的确认报文后要等
2MSL
的时间才能释放
TCP
连接?
这里同样是要考虑丢包的问题,如果第四次挥手的报文丢失,服务端没收到确认
ack
报文就会重发第三次挥手的报文,这样报文一去一回
长时间就是
2MSL
,所以需要等这么长时间来确认服务端确实已经收到了。
8.如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP
设有一个保活计时器,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为
2
小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75
秒钟发送一次。若一连发送
10
个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
9.什么是HTTP,HTTP 与 HTTPS 的区别
HTTP
是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
![](https://i-blog.csdnimg.cn/blog_migrate/414ccc2f180c5643f77f08870bd9c9c7.png)
10.GET和POST区别
浏览器和服务器的交互是通过HTTP协议执行的,
GET
和
POST
是
HTTP
协议中的两种方法。
HTTP
全称为
Hyper Text Transfer Protocol
,中文翻译为超文本传输协议,目的是保证浏览器与服务器之间的通信。
HTTP
的工作方式是客户端与服务器之间的请求
-
应答协议。
HTTP
协议中定义了浏览器和服务器进行交互的不同方法,基本方法有
4
种,分别是
GET
,
POST
,
PUT
,
DELETE
。这四种方法可以理解为,对服务器资源的查,改,增,删。
GET
:从服务器上获取数据,也就是所谓的查,仅仅是获取服务器资源,不进行修改。
POST
:向服务器提交数据,这就涉及到了数据的更新,也就是更改服务器的数据。
PUT
:英文含义是放置,也就是向服务器新添加数据,就是所谓的增。
DELETE
:从字面意思也能看出,这种方式就是删除服务器数据的过程。
GET和POST区别
1. Get是不安全的,因为在传输过程,数据被放在请求的URL中;Post的所有操作对用户来说都是不可见的。 但是这种做法也不时绝对的,大部分人的做法也是按照上面的说 法来的,但是也可以在get请求加上 request body,给 post请求带上 URL 参数。
2. Get请求提交的url中的数据 多只能是2048字节,这个限制是浏览器或者服务器给添加的,http协议并没有对url长度进行限制,目的是为了保证服务器和浏览器能够正常运行,防止有人恶意发送请求。Post请求则没有大小限制。
3. Get
限制
Form
表单的数据集的值必须为
ASCII
字符;而
Post
支持整个
4. Get
执行效率却比
Post
方法好。
Get
是
form
提交的默认方法。
5. GET
产生一个
TCP
数据包;
POST
产生两个
TCP
数据包。对于
GET
方式的请求,浏览器会把
http header
和
data
一并发送出去,服务器响应
200
(返回数据);而对于
POST
,
浏览器先发送
header
,服务器响应
100 continue
,浏览器再发送
data
,服务器响应
200 ok
(返回数据)。
11.什么是对称加密与非对称加密
对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。 由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,非常的慢。
12.什么是HTTP2
HTTP2
提高了网页的性能。 在 HTTP1
中浏览器限制了同一个域名下的请求数量(
Chrome
下一般是六个),当在请求很多资源的时候,由于队头阻塞当浏览器达到
大请求数量时,剩余的资源需等待当前的六个请求完成后才能发起请求。
HTTP2
中引入了多路复用的技术,这个技术可以只通过一个
TCP
连接就可以传输所有的请求数据。多路复用可以绕过浏览器限制同一个域名下的请求数量的问题,进而提高了网页的性能。
13.Session
、
Cookie
和
Token
的主要区别
HTTP
协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。
什么是cookie
cookie
是由
Web
服务器保存在用户浏览器上的小文件(
key-value
格式),包含用户相关的信息。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用
response向客户端浏览器颁发一个Cookie
。客户端浏览器会把
Cookie
保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该
Cookie
一同提交给服务器。服务器检查该
Cookie
,以此来辨认用户身份。
什么是session
session
是依赖
Cookie
实现的。
session
是服务器端对象,session 是浏览器和服务器会话过程中,服务器分配的一块储存空间。服务器默认为浏览器在cookie
中设置
sessionid
,浏览器在向服务器请求过程中传输cookie 包含
sessionid
,服务器根据
sessionid
获取出会话中存储的信息,然后确定会话的身份信息。
cookie与session区别
存储位置与安全性:
cookie
数据存放在客户端上,安全性较差,
session
数据放在服务器上,安全性相对更高;
存储空间:单个
cookie
保存的数据不能超过
4K
,很多浏览器都限制一个站点多保存
20
个
cookie
,
session
无此限制
占用服务器资源:
session
一定时间内保存在服务器上,当访问增多,占用服务器性能,考虑到服务器性能方面,应当使用
cookie
。
什么是Token
Token
的引入:
Token
是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token
便应运而生。
Token
的定义:
Token
是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个
Token
便将此
Token
返回给客户端,以后客户端只需带上这个Token
前来请求数据即可,无需再次带上用户名和密码。使用
Token
的目的:
Token
的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。
Token
是在服务端产生的。如果前端使用用户名
/
密码向服务端请求认证,服务端认证成功,那么在服务端会返回
Token
给前端。前端可以在每次请求的时候带上
Token
证明自己的合法地位。
session与token区别
session
机制存在服务器压力增大,
CSRF
跨站伪造请求攻击,扩展性不强等问题;
session
存储在服务器端,
token
存储在客户端
token
提供认证和授权功能,作为身份认证,
token
安全性比
session
好;
session
这种会话存储方式方式只适用于客户端代码和服务端代码运行在同一台服务器上,
token
适用于项目级的前后端分离(前后端代码运行在不同的服务器下)
未完待续。。。。