计算机网络

计算机网络

1. OSI(Open System Interconnect)七层协议

●应用层(DNS、HTTP、FTP、Telnet):为用户的应用程序提供服务。

●表示层:数据格式转换+数据加密解密

●会话层:建立、管理和维护会话

●传输层(TCP、UDP):建立主机之间的端到端连接,提供数据段传输服务

●网络层(IP):IP选址和路由选择(RIP、OSPF、ARP、RARP)确保IP数据报的及时传送

●数据链路层(网桥、网卡、交换机):将IP数据报封装成帧,完成帧传输和错误检查

●物理层(IEEE802、中继器、集线器):计算机之间通过比特流透明传输

●为什么要分这么多层啊:分开以后更加灵活,各层独立,大问题变为小问题,一层技术革新,其它层不用动。

2. 计算机网络编程的两个主要问题

●如何准确定位网络上的一台主机:在TCP/IP协议中的IP层主要负责网络主机的定位,数据的路由传输,由IP地址可以唯一确定网络上的一台主机(传到NAT,然后NAT根据端口号找到底是内网中的哪台主机)

●找到主机后要如何提供可靠高效的传输:传输层提供面向应用的可靠(TCP)的或非可靠的(UDP)数据传输机制,无需关心IP层是如何处理数据的。

●目前流行的网络编程模型为C/S结构,通信双方一方作为服务器等待客户提出请求并予以响应。客户在需要服务的时候通过DNS查询IP,然后对目标IP发送请求。服务器对应服务一般作为守护进程始终运行。监听网络端口,收到用户请求,就会另外启动一个服务进程(同样也是另一个端口)来响应客户,同时自己继续监听服务端口。

3.TCP/IP四层协议

●应用层(原来的应用层,表示层,会话层合一):最靠近用户那一层,为计算机用户提供应用接口,也为用户直接提供网络服务

●传输层:建立了主机端到端连接,为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制(TCP保证可靠那几项)。该层向高层屏蔽了下层数据通信的细节,是高层用户看到的知识在两个传输实体之间的一条主机到主机的数据通路(外观模式)

●网络层:通过IP寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误的按照地址送给目的端的运输层(即IP层)。这一层就是我们常说的IP协议层

●数据链路层(原数据链路层,物理层合一):通过一些规程或协议来控制这些数据的传输以保证被传输数据的正确性。

4.TCP/UDP

●TCP(传输控制协议):面向连接的协议,也就是安全的协议,发送前要保证连接建立,提供可靠的服务,即TCP连接出书的数据不会丢失,没有重复,按顺序到达。

​ ■只支持点对点通信,面向字节流(发送数据时以字节为单位,一个数据包可以拆分为若干组发送)

​ ■首部开销(20字节)

​ ■维护了一张连接状态表

​ ■支持的协议:HTTP(超文本传输协议),HTTPS(安全超文本传输协议),FTP(文件传输协议),POP3(邮局协议),SMTP(简单邮件控制协议),TELNET(远程登录协议),SSH(用于代替安全性差的TELNET)

●UDP(用户数据报协议):无连接协议,发送前不需要建立连接

​ ■支持一对一,多对一,一对多,多对多

​ ■面向报文的,一个报文只能一次发完

​ ■首部开销8字节

​ ■不需要维持复杂的连接状态表

​ ■只支持的协议:DHCP(动态主机配置);ARP(地址解析协议);

●TCP的三次握手

40

​ ■标志位:SYN(标志位,表示连接是否建立),FIN(标志位,表示连接关闭),ACK(标志位,表示响应号是否有效),ack(响应号,为接受到的seq+1),seq(序列号,随机初始化得到),通过三次握手确认双方收发数据的能力。

​ ■第一次握手:客户端将自身SYN位置1,随机生成一个seq发送给服务端,进入SYN——SENT状态。(相当于客户端告诉服务端,我想要建立连接)

​ ■第二次握手:服务端接收到客户端的SYN=1,知道他想建立连接,所以将自身的SYN和ACK位置也置为1,并且生成一个ack=seq+1,并产生一个新的seq发送回客户端,进入SYN——RCVD状态(第二次握手,确认了客户端发送功能正常,服务端接受功能正常,相当于服务器收到请求后,告诉客户端我知道了,可以建立连接)

​ ■第三次握手:客户端收到服务端的信息后检查产生的ack是否=自身发的seq+1;ACK是否为1,正确后将自身ACK也置为1,产生一个新的ack = 服务器发的seq+1,进入ESTABLISHED状态,服务器收到后检查ACK为1和ack是否为seq+1,如果没有问题也进入ESTABLISHED状态(第三次握手,确认了客户端接受正常,服务端发送正常,相当于客户端得知,服务端已经接收到自己的消息,并且同意建立连接了)

​ ■如果只有两次握手的话:Server无法确认客户端是否接收到自己的消息,也无法保证客户端与服务端之间成功互换序列号。而且会出现以下情况(client发送的连接请求并未丢失,但是由于网络原因滞留了,以至于过了一段时间后才到达服务器,相当于第一次握手,服务器收到请求后,误以为是client发送的请求,于是向client发出报文,同意连接,如果只有两次握手,这个时候链接就建立了,但是由于client并没有发送请求,所以不理睬服务端也不会告诉服务端,但服务端认为连接已经建立了,就一直等待,这样就浪费了资源。)

​ ■若第三次握手中,客户端的ACK未送达会怎么办:

​ ▲服务器端:由于server未收到ACK确认,所以每隔3秒会重发之前的SYN+ACK(相当于重新告诉client),默认重发五次后,自动关闭连接。若中间client接收到后会重传ACK给服务端。

​ ▲客户端:服务器未收到,就会不断向客户端重新确认,如果中间收到了就会继续完成三次握手。如果服务端确认多次无果后自动关闭了,客户端再向服务端发送数据,服务器会回应RST包。

​ ■若建立连接后客户端出故障了怎么办:服务器每收到一次客户端请求后都会重新复位一个计时器,通常为2hours,如果之间未收到任何客户端请求,就会自动向客户端发送一个探测报文,每隔75s发送一个,如果连续10个都没有反应,就认为其出故障了,关闭连接。

●TCP的四次挥手

41

​ ■第一次挥手:客户端将FIN位置1,发送一个序列号seq给服务端,进入FIN——WAIT状态。(相当于告诉服务端,我准备关了)

​ ■第二次挥手:服务端收到后,发送一个ACK=1,表示知道了,并且发送一个ack=seq+1,(标志针对的是这个连接),进入Close——wait状态,此时客户端已经没有要发送的数据了,但是仍然可以接受服务器发来的数据(因为服务器收到客户端断开连接的请求时,可能还有一些数据在网络中未传输完毕,所以这里先恢复知道了,表示我知道你想关了,但是我这边好像没接受完,啥时候完事我告诉你)

​ ■第三次挥手:Server端将FIN置1,发送一个seq给client,进入LAST——ACK状态(表示我这边完事了,关了吧)

​ ■第四次握手:客户端收到服务器的FIN后,将ACK置1,发送一个ack=seq+1给服务器,服务器收到确认ack后进入CLosed状态,客户端等待2MSL(报文段最长寿命),也进入Closed状态。(等待是因为第四次挥手,客户端发送的ack可能丢失,TIME——WAIT就是用来重发可能丢失的ACK报文,如果server没有收到ACK,就会重发FIN,而且肯定在2msl之间,所以client如果在2*msl间没有收到FIN,就表示那边已经收到了,我这边也可以安心关了)

●为什么连接是三次握手,而关闭却是4次呢:因为服务端LISTEN状态下的SOCKET当收到SYN报文的连接请求后,可以把ACK和SYN放到一个报文中发送,而关闭的时候,收到对方的FIN报文,却不确定现在这边是否可以立刻关闭,所以只能先恢复ACK报文,等到确定以后,再回复FIN报文。

5.TCP如何保证可靠传输

●校验和:在数据传输的过程中,将发送的数据段都当做一个16位的整数,将整数相加,并且最前面的进位不丢,补在后面,取反,得到校验和。

​ ■发送方:在发送之前计算校验和,并进行校验和的填充。

​ ■接受方:收到数据后,对数据以同样方式计算,求出校验和,进行比对。

​ ■如果校验和不对那么一定有误,如果一样,数据也不一定正确

44

●序列号和确认应答

​ ■序列号:TCP传输时将每个字节的数据都进行了编号,这就是序列号。

​ ■确认应答:TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答,即发送ack报文(ack=seq+1),以此告诉传输方,接收到了哪些数据。

45

●超时重传:进行TCP传输时,由于确认应答与序列号机制,发送方对于每个发送的数据包,都会收到一个ACK报文,以此判断数据是否被正确接受,如果没有收到接收方的ACK报文,就会对相应的数据进行重传(这个等待时间是动态计算的,默认为500ms一个单位,第一次发送等500ms,没响应就重发,等2*500ms,之后没响应就重发,等4 *500ms ,当累计一定次数后就认为链接异常,关闭连接。)

●连接管理:三次握手+四次挥手

●流量控制:接收端在接收到数据后,对其进行处理。如果发送端发送的数据过快,导致接收端的接收缓冲区很快就被填满了。此时如果发送端仍然发送数据,那么接下来发送端发送的数据就会丢包,从而引起一些列的连锁反应(超时重传等)。TCP可以根据接收端对数据处理的能力决定发送端的发送速度,这就是流量控制。TCP协议的报头有一个16位字段的窗口大小(能表示64K,但最大并不是64K,TCP首部中40个字节中包含一个窗口扩大因子M,所以实际大小为16左移M位),窗口的大小内容实际上是接收端接收数据缓冲区的大小。数字越大,表示接收端接收缓冲区剩余空间越大,网络吞吐量越大。接收端会在确认应答发送ack报文时将自己的及时窗口大小填入,并跟随ACK报文一同发出。发送方根据这个窗口大小值改变自己的发送速度。如果大小为0,那么会停止发送,定期向接收端发送探测数据段,让接收端把窗口大小告诉自己。

46

●拥塞控制:发送端如果一开始就发送大量的数据,可能造成一些问题。所以TCP引入慢启动的机制,在开始仅发送少量的数据探路,清楚网络状态后,再决定以多大速度传输。引入一个拥塞窗口的概念。发送刚开始的时候窗口大小为1,每次收到ACK应答,窗口+1,发送前首先将拥塞窗口与接收端反馈的缓冲区大小比较,取较小值作为实际发送窗口(刚开始是指数增长,当超过一定阈值的时候改为线性增长,当阻塞或者重传发生后,拥塞窗口置1,阈值降低为原来的一半)

47

6.Socket(套接字)

●Socket是TCP/IP协议的一个流行的编程界面,由一个IP地址和一个端口号唯一确定。网络上的两个程序通过一个双向的通讯连接实现数据的交换,链接的每一端都是一个socket。

●Socket是应用层与传输层通信的中间软件抽象层,是一组接口。在设计模式中属于外观模式,把复杂的TCP/IP协议簇隐藏在接口后面,对用户而言,屏蔽了下面复杂的协议。

42

●在计算机中,我们可以通过netstat来观察socket到底是什么

43

​ ■图中的每一行都是一个socket,即每个socket都是一个五元组(协议,本地地址,外部地址,状态 ,PID进程号)

​ ■以第一行为例子,协议为TCP,本地地址和远程地址都是0.0.0.0,表示通信还没有开始,IP地址未定。本地端口好是135,远程端口号还未知;连接状态为LISTENING,表示应用程序已经打开,正在等待与远程主机建立连接。最后一个PID,为进程标识符,能够准确定位唯一的进程。

●Socket的创建:应用程序都有一个socket组件,在应用程序启动的时候,会调用Socket申请创建Socket,即先申请分配一个Socket所需的内存空间,然后为这个空间中放入控制信息,于是一个socket就创建完成了。

●Socket的连接:socket创建完成后,没有数据,也不知道通信对象。这种状态下即使你想让他发送数据,她也不知道发到哪里,所以需要根据网址来查询目标的IP地址(DNS协议呗),查询地址后,再把目标地址告诉协议栈,这时候,客户端这边就准备好了;服务器那边也是创建socket,但它也同样不知道通信对象是谁,所以的需要客户端过来的时候告诉其必要的信息(IP地址和端口号),之后就可以建立连接了。

●Socket的各种状态:

​ ■CLOSED:表示初始状态

​ ■LISTEN:表示服务器端的某个SOCKET处于监听状态,可以接受连接

​ ■SYN_RCVD:表示接收到了SYN报文,一般是在第一次握手后服务器会处于这个状态,很短暂。

​ ■SYN_SENT:与SYN_RCVD相呼应,为第一次握手后客户端处于的状态,表示已经发送了SYN报文。

​ ■ESTABLISHED:表示连接已经建立

​ ■FIN_WATI_1:socket在ESTABLISHED的状态时,想要主动关闭连接,向对方发送了FIN报文,就会进入这个状态。当对方回应后进入FIN_WATI_2状态。

​ ■TIME_WAIT:第二次握手后,服务器处于这个状态,看是否还有发送中的数据未处理完

​ ■LAST_ACK:被动一方确认消息都已经接受后,发送FIN报文,为第三次握手,等待对方完成最后一次握手后,就可以进入CLOSED状态了。

​ ■CLOSING:一种比较罕见的状态,当一方发送FIN报文的情况时,期待对方恢复ACK报文,但等来的却也是FIN报文,即双方同时主动想要关闭连接。

●Socket的通讯过程:

​ ■基于TCP:服务器端初始化Socket,与端口绑定好后,对端口进行监听,当有客户端初始化Socket并通过DNS协议查询到此服务器地址,发送过来之后,进行三次握手,如果连接成功,那么客户端发送请求,服务器接受请求并处理,然后回复客户端。最后四次挥手。

​ ■基于UDP:除了不用三次握手和四次挥手其余与TCP相同。

7. HTTP(超文本传输协议)

●HTTP协议是客户端和服务端之间实现可靠性的传输文字、图片、音频、视频等超文本数据的规范,简称超文本传输协议,属于应用层。

●HTTP请求报文:由请求行(请求方式+要访问的url+HTTP版本号),请求头(附加信息,host域名,cookie,可接受的压缩方案),空行,请求体组成,是我们请求数据时发送给服务器的数据(表明我要什么,注get请求没有请求体),下图为一个post请求报文:

48

●HTTP响应报文:由状态行(版本号+状态码+状态信息),响应首部字段(附加信息,如是否采用长连接),空行,响应内容(服务器返回给我们的数据)组成。

49

●HTTP端口号80:,HTTPS端口号为443

●HTTPS:为HTTP+SSL安全通信线路,由于需要拿到CA证书所以是收费的,HTTP是超文本传输协议是明文传输,而HTTPS是具有安全性的SSL加密传输协议。

●HTTP工作流程:

​ ■DNS解析:将域名解析为IP地址

​ ■通过三次握手建立TCP连接(毕竟HTTP是基于TCP的嘛),与服务器的HTTP端口建立一个TCP套接字连接

​ ■通过TCP套接字,客户向Web服务器发送请求报文

​ ■服务器解析请求,定位请求资源回复请求

​ ■服务器返回请求后会检测connection的状态,如果是close的话则服务器会主动关闭这个tcp连接,若为keepalive,会保持连接一阵子,可以继续接受请求。

●HTTP请求方法:

59

​ ■get:主要为了获取资源,传输数据量小,但效率高,不安全,把请求数据放在url上,可见,

​ ■post:想传输一些内容使用,请求数据放在请求体中,安全(但HTTP网络上都是明文传输,能安全到哪呢),如果按后退按钮,那么POST相当于数据会被重新提交一次,在部分浏览器下,POSt会把header和body分开发送,先发header,服务器返回100状态码后,再发送Body。

​ ■put:想把自己的东西传到服务器上

​ ■head:通过报文的头部来偷心

​ ■delete:删除文件

​ ■options:向服务器请求了解服务器支持哪些方法

●HTTP响应代码:

51

52

53

●Cookie和Session对于http有什么用:http协议无法判断用户身份,所以需要cookie和session

​ ■cookie:由web服务器保存在用户浏览器上的文件(key-value格式),包含用户相关的信息,客户端向服务器发送请求,就提取浏览器中的用户信息由http发送到服务器。

​ ■session:浏览器和服务器会话过程中,服务器会分配一块存储空间给session(服务器默认客户浏览器的cookie中设置sessionid,浏览器在向服务器请求过程中传输的cookie包含sessionid,服务器根据传输cookie中的sessionid获取会话中存储的信息,然后确定会话的身份服务)。

​ ■cookie存在客户端,安全性交叉,session存在服务器,安全性高。

●HTTP与Socket的区别和应用场景

​ ■Socket连接即所谓的长连接,客户端与服务端一旦建立连接将不会主动断掉,适用于网络游戏,直播等

​ ■Http就是所谓的短连接,即客户端向服务器端发送一次请求,服务端响应后连接就断开等待下次连接。适用于电商,办公。

8.HTTPS

●HTTPS=HTTP+SSL:由于HTTP是明文,所以要想办法加以保护,以下为HTTPS的特点

​ ■保密性:对信息内容保密,只有可信的人能访问

​ ■完整性:保证内容不被篡改(否则即使你保密了,我虽然看不懂,但可以给你瞎改)

​ ■身份认证:确保消息接收方正确

​ ■不可否认:发过去就有证据,不可抵赖

●SSL协议:由SSL握手协议,SSL警报协议,SSL记录协议,SSL修改密码规范协议组成

​ ■SSL握手协议:相当于三次握手

​ ■SSL记录协议:记录是SSL发送接受数据的基本单位

​ ■SSL警报协议:类似HTTP状态码,通过反馈不同的消息,进行不同的策略

​ ■SSL修改密码协议:告诉对方,从此刻开始后续的数据将使用加密算法加密传输

●HTTPS请求建立连接的过程

54

​ ■首先通过非对称加密建立通信过程

​ ■在握手阶段,为什么使用三个随机数?防止被猜出。

​ ■Client发出支持的加密算法集

​ ■Server返回选用的加密算法以及自身证书

​ ■Client对算法进行确认,没有问题就生成一个随机数,并用公钥加密

​ ■Server对算法确认,用私钥解密,证明没有问题,同时对网页内容加密,返回给浏览器

​ ■client用约定的算法解密,得到内容

9.HTTP中URL以及URI

●URL统一资源定位符:以描述位置的方式来确定唯一一个资源。

●URI统一资源标识符:每个资源的唯一标识(类似身份证号)

●URL是URI的一种,是用位置方式来确定资源的

55

​ ■协议名:图示HTTP,还可以用别的协议,告诉访问时采用的是什么

​ ■登录认证消息:登陆主机时的用户密码(一般不写)

​ ■服务器地址+端口号(不写则用默认端口)

​ ■资源所在路径:在服务器里的地址

​ 参数:以?开始,表示额外的请求要求,通常使用key=value形式,多个key=value间用&连接

10.HTTP的进化之路

●HTTP/0.9:远古版本,采用纯文本格式,只提供阅览功能(只有get方式从服务器获得HTML文档),响应后关闭。响应只包含文档本身(无响应头,状态码等),请求过程如下:

​ ■三次握手建立连接

​ ■客户端发送请求(只有GET)

​ ■服务端响应请求,数据以ASCII字符流返回给客户端

​ ■传输完成,断开连接。

56

●HTTP/1.0:人类逐渐不满足于文本的传输,想要传输图文等形式,以下为改动点

​ ■增加了POST,HEAD方法

​ ■增加了协议版本号,同时添加文件处理类型

​ ■加入HTTP Header,让HTTP处理请求更加灵活

​ ■加入响应状态码,标记出错原因

57

●HTTP/1.1:随着图文等信息越来越大,每一次上传下载文件都需要建立断开链接,极大增加了开销,为此提出持久链接,即一次TCP链接可以处理多个HTTP请求。

58

●HTTP/2.0:随着互联网技术的发展,人类越来越不满足于现状,所以针对之前版本的如下几个问题进行了改进:

​ ■头部阻塞:HTTP1.1中大家公用一个TCP通道,第一个请求没有结束,第二个请求就要等待。HTTP2.0采用多窗口方式解决,对同一个域名发起多个长连接,如果还是不够用,那么就新建站点(域名分流),多个域名指向同一个服务器。

​ ■多条TCP连接竞争带宽:带宽固定,多条TCP连接同时发起,竞争带宽资源,由于各个TCP连接间没有通信机制,也无法确定哪个优先级高,所以导致想快点完成的反而慢。

​ ■TCP自带慢启动:TCP保证稳定的一种方式。

​ ■头部冗余:HTTP头部采用文本格式,每次都带上全部信息,造成冗余,通过2.0的头部压缩可以通过字典保存常用头部信息,很多字段可以用索引号来代替。

​ ■客户端主动请求:1.1下只有客户端主动发送请求后,服务端才能给予响应,而2.0后服务端可以主动推送消息。

11.NAT(网络地址转换协议)

●原理:替换IP报文头部的地址信息,通常部署在一个组织的网络出口位置,通过将内部网络IP地址替换为出口的IP地址提供公网可达性和上层协议的连接能力。

​ ■内部网络地址:我们都知道IPV4划分了4个网段的地址,而我们用的为ABC类网段,而10.0.0.0-10.255.255.255(A类内部地址),172.16.0.0-172.31.255.255(B类内部地址),192.168.0.0-192.168.255.255(C类内部地址),这些地址可以在任何组织和企业内部使用(不能作为全球路由地址)。对于一个封闭组织,如果其网络不连接到Internet,就可以使用这些地址,其内部的路由管理以及报文传递的方式与其他无差别。

​ ■如果需要访问Internet,又使用的是私有地址的网络,就要在组织的出口位置布置NAT网关,在报文离开私网进入Internet时,将源IP替换为公网地址(通常是出口设备的接口地址)。一个对外的访问请求到达目标后,表现为本组织出口设备发起的请求,因此被请求的服务端可以将响应由Internet发回出口网关,出口网关再将目的地址替换为私网的源主机地址,发回内部(为了实现双向翻译功能,内部需要维护一张关联表,保存会话信息)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JUrYftpe-1650091797331)(L:/myBlog/HexoData/source/pic/60.png)]

​ ■私网IP作为局域网内部主机标识,公网IP作为互联网上的通信标识。

​ ■静态NAT:为一个或一组内部地址提供固定的外部地址

61

​ ■动态NAT:将未注册的IP地址映射到注册IP地址池中的一个地址,(需要多个公网地址组成IP地址池)

​ ■PAT:使用端口号,使得一个公网IP可以同时为多个私网IP服务(我都怀疑端口号是不是就是为了这个发明出来的)

12.DHCP(动态主机配置协议)

●端口号68

●用来做IP地址动态分配,

​ ■局域网中都会有一个DHCP服务器,客户机接入局域网后向DHCP请求IP

​ ■DHCP会根据情况为此分配一个IP(默认可用8天)

​ ■若租约过半,客户机会请求续租(保持IP不变)

​ ■若租约超过87.5%,还联系不上原DHCP服务器,则联系其他DHCP服务器请求IP。

●若Windows IP为169.254.x.x或Linux下为0.0.0.0则为DHCP服务器出故障。

13.DNS(域名解析协议)

●端口号53

●域名转换为IP地址

●递归查询:服务器必须直接给出目标IP与域名的映射关系(无论是否向别人服务器再查询,一定自己直接回复映射关系)

●迭代查询:服务器收到一次迭代查询就回复一次结果,结果不一定是目标IP与域名的映射关系,也可以是其他DNS服务器地址。

14.常见段协议及其默认端口号

●HTTP:超文本传输协议 80 TCP

●pop3:接发邮件协议 110 TCP

●SMTP:简单邮件传输协议 25 TCP

●Telnet:远程登录协议 23 TCP

●FTP:文件传输协议 20/21 TCP

●DNS:域名解析协议 53 UDP

●SNMP:简单网络管理协议 161 UDP

●TFTP:简单邮件传输协议 69 UDP

●RIP:路由信息协议 520 UDP

●DHCP:动态主机配置协议 (服务端67/客户端68) UDP

15.Cookie/Session/Token的进化史

●前文也说过了HTTP刚诞生的时候,只是为了满足大家浏览web文档的需求,所以只有GET请求,浏览完了就走,两个连接没有任何联系。

●随着交互式Web兴起(不光可以浏览,还可以登录,发评论等等),需要一个机制记录每一个链接的关系,这样我们才能知道加入购物车的商品属于谁(商品链接与用户链接建立起关系),于是Cookie诞生。Cookie是某些网站为了辨别用户身份,进行session跟踪而存储在用户本地终端(肯定是加密啦,要不岂不是随便修改),由客户端保存的信息,工作机制如下:

62

​ ■以加入购物车为例,每次浏览器请求后,server都会将本次商品id存储在cookie中返回给客户端,客户端将Cookie保存在本地,下次再将保存的Cookie发送给Server,这样每个Cookie记录着用户的商品id,用户的商品记录就不会丢失。

63

​ ■但是这样的话,随着购物车内的商品越来越多(这个用户的信息越来越多),每次Cookie越来越大,这是一个很大的负担,并且,只是想将一个商品加入购物车,为什么要将历史的记录也要一起返回给server啊。

●Session诞生:由于用户的购物车信息本身保存在server中,所以Cookie里只要能识别用户的身份信息,知道是谁发起了加入购物车操作即可,这样每次请求只要在cookie里带上身份信息,请求体重只要带上本次加入购物车的商品id即可。我们将这种机制称为Session(会话机制),生成的能识别用户身份的字符串为sessionId,工作机制如下:

64

​ ■首先是用户登录,server为用户生成一个session,为其分配一个sessionId(用户唯一标识),然后将此sessionId通过cookie传给浏览器。

​ ■之后浏览器每次添加购物车请求,只要在cookie里带上sessionId = abc这个键值对即可,server根据这个找到对应用户,然后把商品id保存到server中对应的购物车中(也就是每个用户购物车在server端数据库中维护呗)。

​ ■看起来我们已经解决了问题,但是实际生产中,为了保证服务的高可用性,每个服务都在多台机器上部署,通过负载均衡来决定请求打到哪台机器上,这种情况下,请求打到A机器上,机器A生成Session并在cookie中添加sessionid返回给客户端,如果下次访问打到B或者C上,不就找不到之前用户的信息了?(这个有点像单点登录的问题哦)

65

​ ▼解决方式,其实这个比单点登录简单多了,或者是根本不用考虑单点登录,最简单的就是生成Session后进行同步,无论哪台机器都可以,但是耗费资源。高级一些就是Session共享,将Session保存在redis,memcached等中间件中,请求到来时,都去这里找session。缺点是多了一次链接过程,且redis坏了,所有的都没有了(大公司一般都有redis集群,保证高可用,应该没啥问题)

●Token诞生:上述过程讲述了各个链接如何交互的问题,但也说了,为了搞一个验证机制,我们还要搭建一个redis集群?,小厂怎么活,不用集群行不行?那咋保证高可用?干脆不在你那存session了行不,下面介绍一种不用server存session的机制----token

​ ■首先请求方登录,server据此生成token,客户端拿到token后保存到本地,之后向server请求时请求头上带着此token(这不回到最初的起点?)

66

​ ■问题来了,一:都存在客户端,不怕随便搞一个token骗你么?server会有一套验证机制,判断token是否合法;二:token里面都有啥啊?token本身携带uid,即用户唯一标识

​ ■token的教研过程:HTTPS的签名机制

67

​ ■token主要由三部分构成:

​ ▼header:指定了签名算法

​ ▼payload:指定用户id,过期时间等非敏感数据

​ ▼signature:签名,server根据header知道它用了那种签名算法,再用秘钥根据此签名算法对head+payload生成签名,这样一个token就完成了.

​ ▼只要server保证秘钥不泄露(我这就存了一个秘钥,也不用大量的数据,所以就不用集群了),生成的token就是安全的,因为伪造的token没有秘钥无法生成生成响应的签名,会判断非法

​ ■Token的唯一缺陷就是一旦由server生成,过期前就是一直有效的,无法让其失效(除非你让server给你设一个黑名单,但每个token又要到server中走一遍黑名单,那不和session一样了么,所以一般做法是让用户登出的时候,直接在本地移除token)

​ ■最后注意一下,token是放在header的Authorization自定义头里,不是在cookie里的(主要解决cookie不能跨域共享的问题)

​ ■用token实现SSO会很简单:只要在header中的authorie字段加上token即可完成所有跨域站点的认证

68

16. 浅看一下两台计算机间如何通信

69

●对等层之间通信(不同系统中相同层次之间的通信):OSI为每一层的通信都严格定义了协议数据单元格式。

●相邻层之间通信(相邻的上下层之间的通信)

●物理层:实现计算机之间的数据(Bit流)传送,物理层需要尽可能的屏蔽掉传输介质和物理设备之间的差异,使数据链路层不用考虑下面的不同,即实现比特流的透明传输。

●数据链路层:将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。(封装成帧)

​ ■是什么:链路层收到上层网络层传过来的IP数据报后,在其前后部分添加首部和尾部(起始帧分界符(用来表示包起始位置的标记)和帧校验序列(用来检测包是否损坏)),构成一个帧。接收端在接收到物理层提交的比特流后,可以根据首部和尾部的标记,识别帧的开始和结束。

​ ■为什么:物理层只是简单点把计算机连接起来并传输比特流(01序列),如果01序列毫无规则,计算机解读不了,所以要封装成帧。

●网络层:进行通信的两个计算机之间可能会经过很多个数据链路和通信子网。网络层的任务就是选择合适的网间路由和交换节点。即网络层把运输层产生的报文段封装成分组和包进行传输。

​ ■IP协议:用于屏蔽下层物理网络的差异,为上层提供同一的数据报。

70

​ ■IP协议提供无连接,不可靠,尽力的数据投递服务

​ ▼无连接:发送端可以于任何时候自由发送数据,而接收端永远不知道自己会在合适从哪里接收到数据。每个数据报独立处理和传输,一台主机发出的数据报序列,可能取不同的路径,甚至部分数据可能会在传输过程中丢失。

​ ▼不可靠:IP协议本身不保证数据报投递的结果,传输中可能出现丢失、重复、延迟、乱序等,IP协议不对内容进行检测,也不将结果通知双方。

​ ▼尽力:发送方执行数据报的分段与封装,接收方的IP模块进行合段处理。

●传输层:通过以上三层,数据已经能在两个机器中传输了,即建立端到端的连接,传输层的功能就是建立端口到端口的通信(即进程到进程的通信)

●应用层:通过应用进程间的交互来完成网络应用,不用的网络应用需要不同的应用协议,我们称在应用层交互的数据单元为报文。

17.什么是网关呀~

●那么网关到底是什么呢?网关实质上是一个网络通向其他网络的的IP地址,比如有网络A和网络B,网络A的IP地址范围是“192.168.1.1-192.168.1.254”,子网掩码为“255.255.255.0”;网络B的IP地址范围是“192.168.2.1-192.168.2.254”,子网掩码为255.255.255.0。在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使两个网络连接在同一台交换机(或集线器)上,TCP/IP协议也会根据子网掩码(255.255.255.0)与主机的IP地址做“与”运算的结果不同,判定两个网络中的主机处于不同的网络里。而要实现两个网络之间的通信,则必须通过网关。如果网络A中主机发现数据报的目的主机不咋本地网络中,就把数据报发送给自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B中的某个主机。这就是网络A向网络B转发数据报的过程(这不就是NAT么·····)。

●网关有两种工作模式:

​ ■NAT模式:“网络地址转换”,允许一个整体机构以一个公用IP地址出现在Internet上。他就是把内部私有网络地址转换成公网IP(前面不是说过嘛,估计还是PAT吧)

​ ■路由模式:数据不进行NAT转发,直接将内网IP不做伪装传到外网,只适用于内网IP都为外网地址时

●默认网关:一个主机可以有多个网关,默认网关的意思是一台主机如果找不到可用的网关,就把数据发给默认的网关(····那这个也不可用,给它干嘛啊)

●网关作为分布式框架的一个组件,可以为每个服务的实例配置一个网关(搜索服务–searchAPI),也可以为所有服务配置一个总网关(edith),总网关接收所有的流量(流量网关),分发给不同子系统,子网关用于做各个子系统的介入(业务网关)。

71

●设计网关思路(网关必要功能):

​ ■请求路由:调用端不需要知道自己知道其他服务端地址,全部交给gateway来处理。

​ ■服务注册:为了能将请求路由发送到正确的位置,网关应该有服务注册功能。

​ ■负载均衡:一个网关可以接受多个服务实例,所以需要在各个对等的 实例上做负载均衡策略。

​ ■弹力设计:网关还可以把异步、流量控制、熔断、监视都是先进去,让应用服务只关系自己的业务逻辑

​ ■安全方面:数据校验

​ ■灰度发布(xhs的canary):发布前用小流量验证新版本的正确性,如果正常则全量上线

​ ■API聚合:在微服务体系架构中,由于服务变小了,所以客户端可能要多次请求才能得到所有的数据,这样客户端与后端之间的频繁通信会对应用程序的性能产生不利影响。我们可以让网关帮客户端请求多个后端的服务,然后把响应结果拼接起来(xhs搜索的时候,就是召回的结果和广告服务进行拼接)

72

●流量网关(edith):主要任务是控制流量进入集群。

●业务网关:更靠近我们的业务,和应用层打交道

18.最后一步,让我们事无巨细的了解一下搜索的整个过程吧

73

●我们以最简单的拓扑模型为例,首先是浏览器对URL进行解析,从而生成要发送给Web服务器的请求信息

74

75

76

​ ■注:如果蓝色部分省略,即没有路径名时,会访问根目录的默认文件,也就是/index.html或/default.html

​ ■通过如上对URL解析,浏览器就得到了Web服务器名和文件名,接下来就是根据这些信息产生HTTP请求了。

​ ■众所周知,HTTP报文分为请求报文和相应报文,前面也反复提到过,下面简单复习一下吧

77

78

●真实地址查询—DNS

​ ■我们现在已经知道目标服务器的名字了,然后发出了HTTP报文,但是这个报文携带信息很少,甚至不知道自己要去哪里(仅仅知道服务器的域名),所以下一步就是根据URL解析出来的域名,寻找相应的IP地址。

​ ■DNS中的域名是用句号来分割的,越靠右越高级(我们中国的习惯相反,中国一般省在前面市在后面,但毕竟外国人发明的嘛),域名的层级关系类似一个树状结构,前三级为根DNS服务器,顶级域DNS服务器,权威DNS服务器。

79

​ ■域名解析过程:

​ ▼首先,根域名的DNS服务器信息保存在互联网所有的DNS服务器中,这样一来任何DNS服务器都可以找到并访问根DNS服务器,因此客户端只要能找到任意一台DNS服务器,就可以通过它找到根域DNS服务器,然后一步步找到位于下层的某台DNS服务器。

​ ▼客户端首先发出一个DNS请求(前面我们得到了服务器的域名),通过访问本地DNS服务器(客户端的TCP/IP设置中填写的DNS服务器域名地址)这个域名对应的IP是啥。(下面就是分我们之前谈到过的递归查询和迭代查询了)

​ ▼本地域名服务器收到请求后,如果缓存表格里能找到该域名则直接返回对应的IP地址,如果没有,本地DNS会去问他自己的根域名服务器(我们也知道本地域名服务器是递归查询,一定会恢复一个ip)

​ ▼根域名服务器收到本地DNS的请求,发现后置是.com就告诉他,这个归.com关,并把.com的域名服务器地址给他,让他自己去问(这个就是迭代查询)

​ ▼找到.com的域名服务器后,发起请求,询问www.server.com的ip地址,顶级域名服务器给他负责www.server.com的权威DNS服务器地址。

​ ▼找到权威DNS服务器后,查询得到对应的IP地址,告诉本地DNS。

​ ▼本地DNS将IP返回给客户端,这样就完成了域名向IP地址的转换

●知道目的地了,我们便可以出发了----协议栈(应该就是整个OSI模型吧)

​ ■获得IP地址后,就可以将HTTP传输工作交给OS中的协议栈,协议栈分为几个部分,分别承担的不同的责任,上下关系有一定规则,上面部分会向下面部分委托工作,下面部分收到委托的工作并执行。

80

​ ■浏览器通过调用Socket库,委托协议栈工作,协议栈的上半部分有两块(TCP和UDP),他们会接收应用层的委托执行收发数据的操作。

​ ■协议栈的下部分是用IP协议控制网络包首发操作,在互联网中上传数据的时候,数据会被切成一块块的网络包,而将网络包发给对方的操作就是IP协议负责。(网络包的拆分与组装为传输层负责)

​ ▼IP协议中包括ICMP协议和ARP协议

​ ▼ICMP协议:用于告知网络包传送过程中产生的错误以及各种控制信息

​ ▼ARP协议:用于根据IP地址查询相应的MAC地址

​ ■IP下的网卡驱动负责控制网卡硬件,而最下面的网卡负责完成完成实际的收发操作,即对网线中信号执行发送和接受操作。

●详细讲一下中间的每一个过程-----TCP

​ ■HTTP是基于TCP协议的,所以这里先看一下TCP报文头部格式。

81

​ ▼端口号和目标端口号必不可少,用来确定发送给谁。(注意哦,我们这里是端口号,所以传输层是负责端到端(应用到应用)的连接)

​ ▼包的序号:解决包的乱序问题

​ ▼确认序列:seq和ack

​ ▼窗口大小:用来做流量控制,之前提到过,为了保证TCP的可靠性

​ ▼6个状态位:SYN为发起连接,ACK为恢复,RST为重新连接,FIN为结束连接(都是为了维护连接的安全性,每次都要带着状态,会引起对方的状态变更)。

​ ■查看TCP连接状态:netstat-napt

82

​ ■当HTTP请求消息过长,超过MSS(MTU:一个网络包的最大长度,MSS:除去IP和TCP头部后一个网络包的最大长度),TCP就需要把HTTP的数据拆解为一块块的数据发送,数据以MSS的长度为单位进行拆分,每一部分都会加上TCP头信息,然后交给IP模块来发送。

83

​ ■TCP协议里有两个端口,一个是浏览器监听的端口(随机生成),一个是web服务器监听的端口(HTTP为80,HTTPS为443)

​ ■双方建立连接后,TCP报文中的数据就TCP头部+HTTP报文,向下继续传输。

84

●第二步-------IP

85

​ ■IP报头里有原IP和目标IP

​ ■当存在多个网卡的时候,每个网卡一个IP,那么填写源IP的时候就是谁发送填谁的

​ ■可以使用route -n 命令查看当前系统的路由表,来判断哪一块网卡作为源地址IP

​ ■由于HTTP基于TCP所以协议位写TCP的戴好,最终得到的结果为IP报头+TCP报头+HTTP报文

●我们已经知道要去哪个IP地址了,可怎么出发呢?不可能以数据报的形式走吧-------数据链路层

​ ■一个有趣的问题,既然IP能够唯一标识目标主机,那我们还要MAC干嘛

​ ■抽象一点来说,知道了目标IP,但是我们不可能直接从自己的机器发送到目标机器,一定是经过一条路径,而MAC地址就是用来确定这条路径的,通俗来讲,我们将信息发送出来的时候带着MAC,此时目标MAC为下一步到达的MAC。到了路由器的时候,路由器会将MAC头部拿下来,看到IP,然后查找路由表,找到下一站要传送到的位置(路由选择),并再次重新封装并发送,如此循环达到目的主机。

86

​ ■生成IP头部以后,接下来网络包还需要在IP头部前面加上MAC头部(在数据链路层添加),以下为MAC报头格式。

87

​ ■发送方的MAC地址很容易获取,网卡生产的时候就写入ROM里了,直接读出来即可,每个网络适配器一个,eg笔记本电脑通常有无线网络适配器和有线网络适配器,所以就有两个MAC地址。

​ ■接收方的MAC怎么获取呢?不知道的话就喊,这时候就需要我们的ARP协议帮我们找到接收方的MAC地址了

88

​ ■每次发送包前先查询ARP缓存,如果其中已经保存了对方的MAC地址,就不需要ARP查询,直接使用ARP中的缓存地址,(arp -a 查看ARP缓存内容),如果没有缓存对方地址,就进行广播查询(对以太网所有地址询问这个IP是谁的,然后就会有人回答,这个是我哒)。

​ ■至此就在原有的头部又加了一层MAC头部

●该出发了----出口–网卡

​ ■目前为止生成的数据包仅仅是一串二进制信息,而数字是没有办法在网线上传输的,需要把数字信号转化为电信号,负责这个的是网卡。而网卡需要网卡驱动来控制。

​ ■网卡驱动获取包之后,会将其复制到自己的缓存区并加上起始帧分界符(用来表示包起始的位置)和帧校验序列(FCS 用来检测包是否损坏)。最后转化为电信号发送出去。

89

●送行者—交换机

​ ■交换机位于物理链路层,是二级网络设备,目的是将网络包原样转发到目的地

​ ■当电信号到达网线接口,交换机会将电信号转化为数字信号,通过包末尾的FCS校验错误,没有问题则放入缓冲区

​ ■计算机的网卡本身具有MAC,通过核对收到的包的接收方MAC地址判断是不是给自己的,不是则丢弃,而交换机(无MAC地址)则不核对接收方MAC地址,直接接受所有包。

​ ■将包存入缓冲区后,接下来查询这个包接收方的MAC地址是否存在于MAC表中。

90

​ ■当找不到指定MAC时,可能是因为该地址的设备还没有向交换机发送过包,或者被删除了,这种情况下只能给除了源端口之外的所有端口(反正网卡会自动丢掉不是自己的包)发送,有响应后,交换机将其地址写入MAC表。

​ ■广播地址:

​ ▼MAC:FF:FF:FF:FF:FF:FF

​ ▼IP:255.255.255.255

●大门–路由器

​ ■路由器与交换机的区别:

​ ▼路由器是基于IP设计的三级网络设备,路由器有MAC地址和IP地址

​ ▼交换机是基于以太网设计的二级网络设备,没有MAC地址

​ ■路由器基本原理:由于其具有IP和MAC,所以和网卡几乎是一样的,当转发包的时候,路由器端口会接收发给自己的数据包,然后路由表查询转发目标,再由相应的端口作为发送方发送出去。

​ ▼接收:首先将到达的电信号转化为数字信号,并且根据最后的FCS进行校验,如果没有问题就检查MAC头部中的接收方MAC地址,如果是给自己的就放到缓存区,如果不是就丢弃。

​ ▼查询路由表:MAC头部的作用就是将包送达路由器,其中接收方MAC就是路由器的MAC,这里将MAC头部丢弃,接下来根据暴露出来的IP进行包的转发。根据路由表确定转发目标(路由与子网掩码做与操作,再和包中目标地址匹配)

91

​ ▼发送:根据路由表的网关列判断下一站是路由还是目标机,如果网关列是一个IP,则下一站还是路由,如果网关为空,则该IP就是目标地址,知道对方IP后,通过ARP协议根据IP查MAC地址,并再次封装(一直变化的是MAC,报文中的IP一直没变)

●终点站—层层扒皮

​ ■数据报到达服务器后,服务器先查看MAC头部,看是否与自己符合

​ ■然后看IP头部是否与自己符合,并根据IP报头得知上层协议(此处为TCP)

​ ■然后根据上层协议看对应报头(此处为TCP报头,里面有个序列号,确认应答用),最后看端口号,HTTP服务器就是监听这个目标端口

​ ■将这个包发送给监听这个端口的进程,然后返回响应,此时服务器变成了源地址,重新穿衣服。

19.理论都结束啦,最后一个小科普

●万维网:由不同的文档,多媒体文件连通形成的逻辑网络(每个节点都是一个顶级域名,即网站)

●因特网:互联网的一种,包含万维网+电子邮件服务+远程登录服务(QQ)+文件纯属服务

●互联网:由通信的设备,如手机,电脑等组成的网络,包含因特网

●以太网:就是一种局域网技术

20.说点什么吧

​ 耗时3天,终于将以前做的笔记整理完了,秋招快开始了吧,希望会有一个好的结果,计算机网络包含的东西肯定不止这些,但是用于面试,相信大部分还是够了的吧。下一步,打算更新一个JVM,又是一个鸿篇巨著·····想想就头疼,加油,对了以上内容虽然并非都原创,可都是在整理资料的过程中自己记录总结的。在此也感谢下前辈们的付出,辛苦啦。-------------------Mr Deer

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值