总结不易,如果对你有帮助,请点赞关注支持一下
图片来源于网络
为什么要对网路协议进行分层
网络协议分层的缺点: 功能可能出现在多个层里,产生了额外开销
五层协议的体系结构只是为了介绍网络原理而设计的,实际应用还是 TCP/IP 四层体系结构
TCP(传输控制协议)和IP(网际协议) 是最先定义的两个核心协议,所以才统称为TCP/IP协议族
应用层的任务是通过应用进程间的交互来完成特定网络应用,应用层协议定义的是应用进程间的通信和交互规则
对于不同的网络应用需要不同的应用层协议,在互联网中应用层协议很多,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议、FTP协议等等
域名系统(Domain Name System,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。(百度百科)例如:一个公司的 Web 网站可看作是它在网上的门户,而域名就相当于其门牌地址,通常域名都使用该公司的名称或简称。例如上面提到的微软公司的域名,类似的还有:IBM 公司的域名是 www.ibm.com、Oracle 公司的域名是 www.oracle.com、Cisco公司的域名是 www.cisco.com 等
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的 WWW(万维网) 文件都必须遵守这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法
运输层的主要任务是负责两台主机进程之间的通信提供的数据传输服务,应用进程利用该服务传送应用层报文
运输层主要使用一下两种协议
TCP | UDP | |
---|---|---|
是否连接 | 面向连接 | 无连接 |
是否可靠 | 可靠传输,使用流量控制和拥塞控制 | 不可靠传输,不使用流量控制和拥塞控制 |
连接对象的个数 | 只能是一对一通信 | 支持一对一,一对多,多对一和多对多交互通信 |
传输方式 | 面向字节流 | 面向报文 |
首部开销 | 首部最小20字节,最大60字节 | 首部开销小,仅8字节 |
场景 | 可靠性要求较高的场景,文件传输 | 实时性要求较高的场景(IP电话、视频会议、直播) |
每一个应用层(TCP/IP参考模型的最高层)协议一般都会使用到两个传输层协议之一:
运行在TCP协议上的协议:
运行在UDP协议上的协议:
网络层的任务就是选择合适的网间路由和交换节点,确保计算机通信的数据及时传送。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报 ,简称数据报。
互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Intert Prococol)和许多路由选择协议,因此互联网的网络层也叫做网际层或 IP 层。
数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。
在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束
在物理层上所传送的数据单位是比特。 物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的
TCP怎么保证数据传输的可靠性
停止等待协议中超时重传是指只要超过一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送过的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重转时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为自动重传请求ARQ
停等式ARQ对信道利用率低,连续ARQ协议可提高信道利用率,发送方维护一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认,接收方一般采用累积确认,对按序到达的最后一个分组发送确认,表明到这个分组位置的所有分组都已经正确收到了
信道利用率高,容易实现,即使确认丢失,也不必重传。
不能向发送方反映出接收方已经正确收到的所有分组的信息。 比如:发送方发送了 5条 消息,中间第三条丢失(3号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫 Go-Back-N(回退 N),表示需要退回来重传已经发送过的 N 个消息。
拥塞控制和流量控制的区别
拥塞:对资源的需求 > 可用资源时 网络的性能变坏
拥塞控制:全局过程,防止过多的数据注入网络中,使得网络中路由器或者链路不过载
流量控制:点对点通信的控制,抑制发送端发送数据的速率,便于接收端来得及接受
拥塞控制的方法
主要有四种算法:慢开始、拥塞避免、快重传、快恢复
发送方维护一个拥塞窗口,先进行慢开始算法,一开始发送方发送一个字节,在收到接收方的确认后,然后发送的字节数量增大一倍,按照指数逐步增大窗口的大小,直到达到慢开始门限。然后使用拥塞控制算法,增长速率变为线性增长,直到出现超时,重新将窗口的大小调为1字节,使用慢开始算法,同时慢开始门限调整为超时点的一半,达到门限后继续执行拥塞避免,如果收到3-ACK,可能是报文丢失,使用快恢复算法发送缺失的报文段,同时执行快恢复算法,将门限调整至此时窗口的一半,并执行拥塞避免算法
流量控制的方法
滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的可以接受缓冲区大小(这个字段越大说明网络吞吐量越高),从而控制发送方的发送速度,不过如果接收端的缓冲区一旦面临数据溢出,窗口大小值也会随之被设置一个更小的值通知给发送端,从而控制数据发送量(发送端会根据接收端指示,进行流量控制)。
滑动窗口是解决流量控制的问题的方法,如果接收端和发送端对数据包的处理速度不同,如何让双方达成一致,接收端的缓存传输数据给应用层,但这个过程不一定是即时的,如果发送的速度太快,会出现接受端的overflow,流量控制解决的是这个问题
TCP双方各自维护一个发送窗口和接受窗口,发送窗口只有收到发送窗口内字节的ACK确认,才会移动发送窗口的左边界,接收窗口只有在前面所有的段都确认的情况下才会移动左边界,当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对端会对这些数据重传。
请求行
请求头
空白填充
请求体
HTTP状态码表示客户端HTTP请求的返回结果、标识服务器处理是否正常、表明请求出现的错误等
类别 | 原因短语 |
---|---|
1XX | Informational(信息性状态码) 接受的请求正在处理 |
2XX | Success(成功状态码) 请求正常处理完毕 |
3XX | Redirection(重定向状态码) 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) 服务器处理请求出错 |
常用HTTP状态码
1xx:
100:通知浏览器本次返回的资源文件,并不是一个独立的资源文件,需要浏览器接受响应包后,继续向Http服务器索要其他资源文件
2xx | 成功(请求被正常处理) |
---|---|
200 | OK,表示从客户端发来的请求在服务器端被正确处理 |
204 | No content,表示请求成功,但响应报文不含实体的主体部分 |
206 | Partial Content,进行范围请求成功 |
3XX | 重定向(表明浏览器要执行特殊处理) |
---|---|
301 | moved permanently,永久性重定向,表示资源已被分配了新的 URL |
302 | found,临时性重定向,表示资源临时被分配了新的 URL |
303 | see other,表示资源存在着另一个 URL,应使用 GET 方法获取资源(对于301/302/303响应,几乎所有浏览器都会删除报文主体并自动用GET重新请求) |
304 | not modified,表示服务器允许访问资源,但请求未满足条件的情况(与重定向无关) |
307 | temporary redirect,临时重定向,和302含义类似,但是期望客户端保持请求方法不变向新的地址发出请求 |
4XX | 客户端错误 |
---|---|
400 | bad request,请求报文存在语法错误 |
401 | unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息 |
403 | forbidden,表示对请求资源的访问被服务器拒绝,可在实体主体部分返回原因描述 |
404 | not found,表示在服务器上没有找到请求的资源 |
5XX | 服务器错误 |
---|---|
500 | internal sever error,表示服务器端在执行请求时发生了错误 |
501 | Not Implemented,表示服务器不支持当前请求所需要的某个功能 |
503 | service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求 |
作为标准的C/S模型,http协议总是由客户端发起,服务器进行响应
https通信是建立在SSL连接层之上的请求和响应,客户端将加密组件发送到服务器端,服务端进行匹配后将数字证书等信息发送到客户端,客户端进行证书验证,验证通过后使用非对称加密对数据的密钥进行协商,协商后得到对称的加密密钥,然后使用对称算法进行TCP链接,然后与客户端进行三次握手后,进行数据传输,传输完成后,四次挥手,断开链接,通信结束。
对称加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发送给对方
非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但是私钥只有自己知道,发送密文的一方使用对方的公钥进行加密处理,对方接受到加密信息后,使用自己的私钥进行解密。由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,非常的慢
区别 | HTTP | HTTPS |
---|---|---|
端口 | 80 | 443 |
传输协议 | 超文本传输协议,属于明文传输,客户端于服务器端都无法验证对方的身份 | 安全的超文本传输协议,经过SSL(Secure Socket Layer)加密后的传输协议,SSL运行于TCP之上 |
安全性 | 不安全 | 使用了TLS/SSL加密,比http更加安全,共享秘钥加密和公开秘钥加密并用的混合加密机制 |
开销 | - | 需要申请CA证书,证书一般需要向认证机构购买 |
资源消耗 | 较少 | 由于加解密处理,会消耗更多的 CPU 和内存资源 |
HTTP2可以提高网页的性能
HTTP1(短连接)中浏览器限制了同一个域名下的请求数量(Chrome一般是6个),但在请求很多资源的时候,由于队列阻塞,浏览器达到最大请求数量时,剩余资源需要等待当前六个请求完之后才能发起请求
HTTP2(长连接)引入了多路复用技术,这个技术可以只通过一个TCP连接就可以传输所有请求数据,多路复用可以绕过浏览器限制同一个域名下的请求数量的问题,进而提高了网页的性能
长连接(HTTP1.1、HTTP2):client方与server方先建立连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在。此种方式常用于P2P通信。
短连接(HTTP1.0):Client方与server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此方式常用于一点对多点通讯。
总结
由上可以看出,长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。不过这里存在一个问题,存活功能的探测周期太长,还有就是它只是探测TCP连接的存活,属于比较斯文的做法,遇到恶意的连接时,保活功能就不够使了。在长连接的应用场景下,client端一般不会主动关闭它们之间的连接,Client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可 以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某客户端连累后端服务。
短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。
HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份
Cookie是由Web服务器保存在用户浏览器上的小文件(key-value格式),包含用户相关信息,客户端向服务器发起请求,如果服务器需要记录该用户的状态,就使用response向客户端浏览器颁发一个Cookie(【将Cookie写入到响应头中】来交还给当前浏览器。)。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户身份
Cookie的销毁时间
//表示Cookie对象将在硬盘上存活60s
Cookie.setMaxAge(60);
Session是依赖于Cookie实现的,Session是服务器对象
Session是浏览器和服务器会话过程中,服务器分配的一块存储空间,服务器认为浏览器在Cookie中设置SessionId,浏览器在想服务器请求过程中传输 cookie 包含 sessionid,服务器根据 sessionid 获取出会话中存储的信息,然后确定会话的身份信息。
Session的销毁时间
<session-config>
<session-timeout>5</session-timeout><!--当前网站中每一个session最大的空闲时间是5mins-->
</session-config>
区别 | Session | Cookie |
---|---|---|
存储位置 | 服务端计算机内存中 | 客户端计算机(内存/硬盘) |
数据类型 | 共享数据只能是String类型 | SessionMap集合存储共享数据,可以存储任意类型的共享数据 |
安全性 | 安全性较差,可能被伪造 | 安全性相对较高 |
存储空间 | 单个Cookie保存的数据不能超过4K,很多浏览器最多保存20个Cookie | 无限制 |
占用服务器资源 | - | session一定时间内保存在服务器上,当访问增多,占用服务器性能 |
为什么需要Token
Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码是否正确,并做出相应提示,在这样的背景下,Token便应运而生
什么是Token
Token是服务端生成的一串字符串,以做客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将次Token返回给客户端,以后客户单只需要带上这个Token来请求数据即可,不需要带上用户名和密码
使用Token的目的
Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮
Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位
用户登录的时候,服务器根据用户名和密码在服务器数据库中校验该用户是否正确,校验正确后则可以根据用户ID和时间戳等属性加密生成一个Token,并返回给浏览器,只要这个访问会话没有关闭,所有访问服务器的请求都会带上这个Cookie
如何保证Cookie不会被窃取
Servlet(Servlet Applet),全称Java Servlert .是用Java编写的服务器端程序。其主要功能在与交互式的浏览和修改数据,生成动态Web内容。狭义的servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet的类,一般情况下,人们将Servlet理解为后者。比如HttpServlet类继承自Servlet类,可以利用继承Http Servlet 来实现Http请求,当不是Http请求的时候,也可以定义其他形式的Servlet。
Servlet不是线程安全的,多线程并发的读写会导致数据不同步的问题
解决的办法是尽量不要定义name属性,而是要把name变量分别定义在doGet()和doPost()方法内。虽然使用synchronized(name){}语句块可以解决问题,但是会造成线程的等待,不是很科学的办法。
注意:多线程的并发的读写Servlet类属性会导致数据不同步。但是如果只是并发地读取属性而不写入,则不存在数据不同步的问题。因此Servlet里的只读属性最好定义为final类型的。
SYN
SYN是TCP/IP建立连接时使用的握手信号,在客户端和服务端建立连接时客户端首先发送一个syn消息,服务端使用syn-ack应答表示接收到了这个消息,最后客户端再以ack消息响应,这样再客户端和服务器之间才能建立起可靠的TCP连接,数据才可以在客户端和服务器之间传递。
为什么要回传SYN
接收端传回发送的SYN是为了告诉发送端,服务端确认接受到了信号
为什么要传ACK
传了syn证明发送方到接收方的通道没有问题,但是接收方到发送方的通道还需要ack信号来进行验证
为什么需要三次握手
为了信息对等和防止出现请求超时导致脏连接
如果只有两次握手的话,服务器返回的确认报文如果丢失,客户端没有收到确认,所以关闭连接,但是此时服务端已经开启了连接
为什么需要四次挥手
由于TCP的半关闭造成的,半关闭就是TCP提供了连接的一端在他结束它的发送后还能接受来此另一端的发送
第二次挥手后服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放,此时客户端已无数据发送,而服务端还可以向客户端发送数据,所以第二次挥手不能发送FIN报文,只有当服务端也没有数据要发送了,才在第三次挥手时发送FIN报文,告诉客户端不再发送数据了。
为什么客户端关闭连接前需要等待2MSL
MSL(Maximum Segment Lifetime),为“报文最大生存时间”,是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
同时使用TCP和UDP协议
DNS在区域传输的时候使用TCP协议。其他时候使用UDP协议
DNS区域传输时使用TCP协议
DNS规范规定了两种DNS服务器:主DNS服务器和辅助DNS服务器,辅助域名服务器会定时向主域名服务器进行查询以便了解数据是否有变动,如有变动,会执行一次区域传输,进行数据同步。区域传送使用TCP而不是UDP,因为数据同步传送的数据量比一个请求应答的数据量要多的多。而TCP是一种可靠连接,保证了数据的准确性
域名解析时使用UDP协议
客户端向DNS服务器查询域名,一般返回的内容不超过512字节,使用UDP传输即可,不需要经过TCP三次握手,这样DNS服务器负载更低
socket是传输层和应用层之间的一个抽象层,socket是一种打开–读/写–关闭模式的实现,服务器和客户端各自维护一个”文件“(Unix一切皆文件),在建立连接打开后,可以向文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
socket通信过程
socket保证了不同计算机之间的通信,也就是网络通信。对于网站,通信模型是服务器和客户端之间的通信,两段都建立了一个Socket对象,然后通过Socket对象对数据进行传输。通常服务器处于一个无限循环,等待客户端的连接
客户端过程:
创建socket,连接服务器,将socket与远程主机连接,发送数据,读取响应数据,直到数据交换完毕,关闭连接,结束TCP对话
服务端过程:
创建socket,与本机地址及端口进行绑定,然后通知TCP准备好接收连接,调用accept()阻塞,等待来自客户端的连接。如果客户端与服务器建立了连接,客户端发送数据请求,服务器接收请求并处理请求,然后把响应数据发送给客户端,客户端读取数据,直到数据交换完毕,最后关闭连接。
PING是用于测试网络连接质量的程序。PING发送一个ICMP(Internet Control Messages Protocol)即网络控制报文协议
原理
利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相同,时延是多少
一、实现负载均衡的几种技术
1、HTTP重定向协议实现负载均衡:根据用户的http请求计算出一个真实的web服务器地址,并将该web服务器地址写入http重定向响应中返回给浏览器,由浏览器重新进行访问。
2、DNS域名解析负载均衡:原理:在DNS服务器上配置多个域名对应IP的记录。例如一个域名www.baidu.com对应一组web服务器IP地址,域名解析时经过DNS服务器的算法将一个域名请求分配到合适的真实服务器上。
3、反向代理负载均衡:反向代理处于web服务器这边,反向代理服务器提供负载均衡的功能,同时管理一组web服务器,它根据负载均衡算法将请求的浏览器访问转发到不同的web服务器处理,处理结果经过反向服务器返回给浏览器。
4、IP负载均衡:在网络层通过修改目标地址进行负载均衡。
5、数据链路层负载均衡:在数据链路层修改Mac地址进行负载均衡。
二、常见的负载均衡算法
轮询法、随机法、加权轮询法、加权随机法
Cookie 与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。
但为什么禁用Cookie就不能得到Session呢?因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了。
假定用户关闭Cookie的情况下使用Session,其实现途径有以下几种:
参考:
《图解HTTP》
《通信网络基础》
计网面试题
一位牛客大佬总结的知识点,链接找不到了
总结不够全面,持续更新…