计算机网络必会

为了方便理解,所以将计算机之间的通信进行分层讨论,他只是只用理论体系,帮助我们按照逻辑去理解计算机之间的通讯。
1.目前已掌握的分层方法:
OSI七层:物理层、链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP模型:网络接口层(物理层、链路层)、网路层(IP)、传输层(UDP/TCP)、应用层(会话层、表示层、应用层)
5层协议的原理体系结构:物理层、链路层、网络层、传输层、应用层(会话层+表示层+应用层)——目前所采用的


2.局域网和互联网
可以理解为一个互联网是由多个局域网所组成的,而局域网就是在家里、公司、或者学校等一个区域内计算机相互通信的网络。

3.网络层:IP,计算机是通过IP地址查找到听一台计算机进行通信的

4.传输层:UDP/TCP协议,运输层提供应用层提供端到端通信服务,通俗的讲,两个主机通讯,也就是应用层上的进程之间的通信,也就是转换为进程和进程之间的通信了。
比如你用你的电脑qq发给另一台登陆qq的电脑。这两个qq都有各自的端口,而传输层两个端口通信的介质。其中重要的就是以下连个协议。
(1)UDP协议
用户数据报协议,与Tcp协议一样,都是在网络层。
无连接:意思就是在通讯之前不需要建立连接,直接传输数据。
不可靠:是将数据报的分组从一台主机发送到另一台主机,但并不保证数据报能够到达另一端,
任何必须的可靠性都由应用程序提供。在 UDP 情况下,虽然可以确保发送消息的大小,却不能保证消息一定会达到目的端。
没有超时和重传功能,当 UDP 数据封装到 IP 数据报传输时,如果丢失,会发送一个 ICMP 差错报文给源主机。
即使出现网络阻塞情况,UDP 也无法进行流量控制。此外,传输途中即使出现丢包,UDP 也不负责重发,
甚至当出现包的到达顺序杂乱也没有纠正的功能
1、应用层协议中DNS,也就是根据域名解析ip地址的一个协议,他使用的就是UDP
2、DHCP,这个是给各电脑分配ip地址的协议,其中用的也是UDP协议


(2)TCP协议——与UDP的区别,相当于传输层优化版
TCP协议是面向连接的、可靠传输、有流量控制,拥塞控制,面向字节流传输等很多优点的协议。其最终功能和UDP一样,
在端和端之间进行通信,但是和UDP的区别还是很大的。
TCP比udp的报文结构复杂,这些多的内容,是的TCP比UDP更加可靠稳定。
具体多了:序列号(可靠传输)、确认应答(可靠传输)、控制位、窗口(可靠传输)、填充
其中在面向连接时使用SYN控制位进行三次握手,能够确保发送的端口是自己的想要指定的。

(3)TCP的三次握手,与四次握手

**TCP三次握手建立连接**
一开始客户端和服务端都市关闭状态,但是在某个时刻,客户端需要和服务端进行通信,此时双方都会各自准备好端口,服务器段的端口会处于监听状态,等待客户端的连接。客户端可会知道自己的端口号,和目的进程的端口号,这样才能发起请求。

第一次握手:客户端想与服务器进行连接了,所以状态变为主动打开,同时发送一个连接请求报文给服务器段SYN=1,并且会携带x个字节过去。发送完请求连接报文后,客户端的状态就变为了SYN_SENT,可以说这个状态是等待发送确认(为了发送第三次握手时的确认包)

第二次握手:服务端接收到连接请求报文后,从LSTTEN状态变为被动打开状态,然后给客户端返回一个报文。这个报文有两层意思,一是确认报文,而可以达到告诉客户端,我也打开连接了。发完后,变为SYN_RCVD状态(也可以说是等待接受确认状态,接受客户端发过来的确认包)

第三次握手:客户端得到服务器端的确认和知道服务器端也已经准备好了连接后,还会发一个确认报文到服务器端,告诉服务器端,我接到了你发送的报文,接下来就让我们两个进行连接了。客户端发送完确认报文后,进入ESTABLISHED,而服务器接到了,也变为ESTABLISHED

进入到ESTABLISHED状态后,连接就已经完成了,可以进行通信了。

问题:为什么需要第三次握手,有前面两次不就已经可以了吗?

假设没有第三次握手,客户端发送一个连接请求报文过去,但是因为网络延迟,在等待了一个超时时间后,
客户端就会在重新发一个请求连接报文过去,然后正常的进行,服务器端发回一个确认连接报文,然后就开始通讯,
通讯结束后,那个第一次因为网络延迟的请求连接报文到了服务器端,服务器端不知道这个报文已经失效,
也发回了一个确认连接报文,客户端接收后,发现自己并没有发送连接请求(因为超时了,所以就认为自己没有发),
所以对这个确认连接请求就什么也不做,但是此时客户端不这么认为,他认为i连接已经建立了,
就一直打开着等待客户端传数据过来,这就造成了极大的浪费。如果有了第三次握手,那么客户端就可以通知服务器了。
所以第三次握手也很重要。三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

**TCP四次握手断开连接**
第一次挥手:从ESTABLISHED变为主动关闭状态,客户端主动发送释放连接请求给服务器端,FIN=1。
发送完之后就变为FIN_WAIT_1状态,这个状态可以说是等待确认状态。
第二次挥手:服务器接收到客户端发来的释放连接请求后,状态变为CLOSE_WAIT,然后发送确认报文给客户端,
告诉他我接收到了你的请求。为什么变为CLOSE_WAIT,原因是是客户端发送的释放连接请求,
可能自己这端还有数据没有发送完呢,所以这个时候整个TCP连接的状态就变为了半关闭状态。服务器端还能发送数据,
并且客户端也能接收数据,但是客户端不能在发送数据了,只能够发送确认报文。客户端接到服务器的确认报文后,
就进入了FIN_WAIT_2状态。也可以说这是等待服务器释放连接状态。
第三次挥手:服务器端所有的数据度发送完了,认为可以关闭连接了,状态变为被动关闭,所以向客户端发送释放连接报文,
发完之后自己变为LAST_WAIT状态,也就是等待客户端确认状态
第四次挥手:客户端接到释放连接报文后,发送一个确认报文,然后自己变为TIME_WAIT,而不是立马关闭,因为客户端发送的确认报文可能会丢失,丢失的话服务器就会重传一个FIN,
也就是释放连接报文,这个时候客户端必须还没关闭。 当服务器接受到确认报文后,服务器就进入CLOSE状态,也就是关闭了。但是由于上面说的这个原因,
客户端必须等待一定的时间才能够进入CLOSE状态。

为什么关闭连接多一次握手,同样都是客户端先发送申请,主要原因就是多了一个半关闭的的环节,即服务端能发送数据,而客户端只能接受不能发送了。
待服务器发送完以后,认为可以关闭,会向客户端发送报文,等待客户端做最后确认后中断连接。

5.应用层:位于计算机网络体系结构的最上层,前面四层做的所有事情就是为了他服务,他也是设计和建立计算机网络的最终目的,通俗的讲,就是我们开发的应用软件,就处于这一层。
(1)DNS域名解析协议
它的作用就是将域名解析成对应的IP地址。因为让我们人去记那些IP地址,很难记得住,
所以就想办法让IP地址转变为了现在的域名(www.baidu.com)同IP地址找到了,就能找到我们要访问的服务器了。

(2)HTTP协议:服务器与客户端的请求与响应
URL格式:<协议>://<主机>:<端口>/<路径> 平常会省略协议和端口号,因为这些度是默认的,在访问主页时,路径也会省略。比如www.baidu.com这个默认进入百度的主页 完整写法 http://www.baidu.com:80/index.htm

(3)浏览器通过网址访问网页是如何做到的
第一步:我们一般都是通过域名进行访问的,所以要想访问到目标服务器/主机,首先就是要利用DNS域名解析协议把域名解析成IP地址,然后通过IP地址找到目标服务器
第二步:客户端按照一定的格式向服务端发送请求报文,主要包括请求方法(get/post)、Host域名、路径、以及其他相关的header
第三步:服务器在收到请求以后会给客户端一个响应报文,其格式与请求报文类似,但里面包含最主要的信息就是
响应状态码(访问成功与失败通过状态码告诉客户端)、响应类型:由Content-Type指定、以及其他相关的Header、
其次就是Body,包含响应的内容,网页的HTML源码就在Body中。
第四步:果浏览器还需要继续向服务器请求其他资源,比如图片,就再次发出HTTP请求,重复步骤1、2。

(4)需要了解的响应状态码
100-199表示消息中包含一个临时的信息响应, 200-299表示请求成功,300-399表示请求需要被重定向到另一个资源,
400-499表示客户 端发生了一个不应该重复的错误,500-599表示服务器端遇到了一个错误。
具体:
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

(5)http与https的区别
HTTPS和HTTP的区别主要如下:

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
(6)长连接与短链接
短链接:客户端与服务端通信,发送数据。每发送一次数据,必须得进行三次握手四次挥手。如果想要发送多个数据,
就会不停的三次握手四次挥手,这样不断的进行三次握手四次挥手,很浪费资源。
长连接:三次握手建立连接以后,不马上断开,知道数据发完之后才断开。

其特点导致各有利弊,看应用场景。
如果一个游戏,用户登录以后先当于长连接,客户端与服务端不断进行交互,但如果你长时间不断开就会被强制中断
因为占用资源。
如果一个web服务器,就没必要长连接,访问完就立刻中断,如果很多给一直连着,服务器会因为被占用过多导致性能下降。


restful API
它主要用于客户端和服务器交互类的软件。
restful API 是基于HTPP的一种协议,他的出现,就是为了给移动端、PC机、以及其他
展示媒介的前端,与后台服务器互动的一种规范。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

那什么是rest,为什么要rest呢,rest就是指用url定位资源,用HTTP动词描述操作。
原则
1.资源。网络实体,文本,歌曲,图片。HTML XML JSON
2.统一接口,通过HTTP动词实现
3.URI:同定位资源的方式,即URL
4.无状态的
5.URL里有API版本号,不能有动词。
如果记录数量过多的话,会过滤

说说Cookie和Session的区别?

1、Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端。

2、Cookie有大小限制以及浏览器在存cookie的个数也有限制,Session是没有大小限制和服务器的内存大小有关。

3、Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击。

4、Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。

Session与JWT都是为了身份提供者和身份认证者之间传递用户身份信息,多用于在用户登录上。

而区别就在于,由于http是无状态的,所以当用户登陆以后,为了使客户端与服务端能够保持通信,
会在客户端,也就是浏览器保存一个cookie,在服务器保存一个session。但session会保存一段时间之后才会消失,
所以当用户过多的时候,会增加服务器的压力。
而JWT采用的则使另外一种方式。它仅仅在客户端形成token,每次在请求时只需携带token,服务端进行认证解析即可,更加的轻量级。
JWT构成简单,占用字节小,便于传输。

JWT 分为由头部(声名)、载荷(存放信息)、签证构成
头部 是一种数据格式{K:V ,K:V}


给出子网掩码,判断哪个IP地址在同一个网段中。

猜你喜欢

转载自www.cnblogs.com/SutCoderHang/p/9703511.html