目录
- HTTP响应码有哪些,分别代表什么含义?
- Forward与Redirect的区别
- GET和POST请求的区别
- TCP/IP网络模型
- 说说TCP和UDP的区别(传输层协议)
- UDP协议(User传输 + Data数据 + Protocol协议)
- HTTP与HTTPS的区别
- HTTP(超文本传输协议)
- HTTPS(安全版的HTTP)
- 什么是Socket(是传输层和应用层之间的一个抽象层)
- 什么是TCP的长连接和短连接
- TCP粘包是怎么产生的?怎么解决这个问题
- 如何实现跨域
- TCP是如何保证消息不会丢失
- HTTP和TCP/IP的区别
HTTP响应码有哪些,分别代表什么含义?
响应码的五种类型
- 1xx:信息,请求收到,继续处理
- 2xx:成功,行为被成功地接受、理解和采纳
- 3xx:重定向,为了完成请求,必须进一步执行的动作
- 4xx:客户端错误,请求包含语法错误或者请求无法实现
- 5xx:服务器错误,服务器不能实现一种明显无效的请求
所有的响应码(标记OK的就是常用的)
1xx
100:临时响应,客户必须继续发出请求
101:客户要求服务器根据请求转换HTTP协议版本,主要用于websocket或HTTP2升级
2xx
200:请求成功,请求所希望的响应头或数据体将随此响应返回(OK)
201:已创建,请求成功并且服务器创建了新的资源
202:已创建,服务器已经接受请求,但尚未处理
203:非授权信息,返回信息不确定或不完整
204:无内容,服务器成功处理请求,但返回信息为空(OK)
205:重置内容,服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206:部分内容,服务器成功处理了部分请求
3xx
300:多种选择,针对请求,服务器可执行多种操作,请求的资源可在多处得到
301:永久移动,请求的网页已永久移动到新位置(OK)
302:临时移动,服务器目前从不同位置的网页响应请求,但请求者应该继续使用原有位置来进行以后的请求(OK,跳转到其他地方最后还会跳转回来)
303:查看其他位置,建议客户访问其他URL或访问方式
304:未反应,客户端已经执行了GET,但文件未变化
305:使用代理,请求的资源必须从服务器指定的地址(代理访问)得到
306:前一版本HTTP中使用的代码,现行版本中不再使用
307:临时重定向,申明请求的资源临时性删除
4xx
400:错误请求,如语法错误,服务器不理解请求的语法(OK)
401:未授权,请求授权失败(OK)
402:保留有效ChargeTo头响应
403: 禁止访问,服务器拒绝请求,请求不允许(OK,一般是权限)
404:未找到,服务器找不到请求的网页或URL(OK)
405:方法禁用,用户在Request-Line字段定义的方法不允许
406:不接受,无法使用请求的内容特性响应请求的网页
407:需要代理授权,类似401,用户必须首先在代理服务器上得到授权
408:请求超时,客户端没有在用户指定的时间内完成请求(OK,这个好背!)
后面暂时不去管了,太多了。。。
409:对当前资源状态,请求不能完成
410:服务器上不再有此资源且无进一步的参考地址
411:服务器拒绝用户定义的Content-Length属性请求
412:一个或多个请求头字段在当前请求中错误
413:请求的资源大于服务器允许的大小
414:请求的资源URL长于服务器允许的长度
415:请求资源不支持请求项目格式
416:请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417:服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求
5xx
500:服务器内部错误,服务器产生内部错误,无法完成请求(OK)
501:尚未实施,服务器不具备完成请求的功能,服务器不支持请求的函数
502:错误网关,服务器作为网关或代理,上游服务器(是客户端??或者是网关之前的服务器)收到无效响应(OK,如网关挂了)
503:服务不可用,服务器超载或宕机维护(OK)
504:网关超时,服务器作为网关或代理,但是没有及时从上游服务器收到请求
505:HTTP版本不受支持,服务器不支持请求中用到的HTTP版本
原文地址:常见HTTP状态码都有哪些,分别表示什么意思!
Forward与Redirect的区别
Forward 转发(又叫直接转发)
客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。
Redirect 重定向(又叫间接转发)
实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的
例子
- Forward:A找B借钱,B说没有,B去找C借,借到借不到都会把消息传递给A(B亲力亲为)
- Redirect:A找B借钱,B说没有,让A去找C借(B自己不动)
GET和POST请求的区别
原文链接:https://www.cnblogs.com/logsharing/p/8448446.html
关键字
HTTP、url参数、请求体、header数据、TCP数据包、验证数据包完整性
GET和POST是什么?
是HTTP协议中的两种发送请求方式,HTTP的底层是TCP/IP
共同点
本质都是HTTP,对于数据传输的形式来说,GET和POST请求是一样的,GET和POST能做的事情是一样一样的。你要给GET加上request Body,给POST带上url参数,技术上是完全行的通的。
故事(篇幅太长有点废话了,懂了就可以不看)
在我大万维网世界中,TCP就像汽车,我们用TCP来运输数据,它很可靠,从来不会发生丢件少件的现象。但是如果路上跑的全是看起来一模一样的汽车,那这个世界看起来是一团混乱,送急件的汽车(急的请求)可能被前面满载货物的汽车(不急的请求)拦堵(为什么会拦住?请求是同步的吗?)在路上,整个交通系统一定会瘫痪。
为了避免这种情况发生,交通规则(HTTP请求方式规范)诞生了。HTTP给汽车运输设定了好几个服务类别,有GET, POST, PUT, DELETE等等,HTTP规定,如果是GET请求,要给汽车贴上GET的标签(设置method为GET),而且要求把传送的数据放在车顶上(url中)以方便记录。如果是POST请求,就要给汽车贴上POST的标签,并把传输的数据放在车厢里(请求Body中)。
当然,你也可以在GET的时候往车厢内偷偷藏点货物,但是这是很不光彩;也可以在POST的时候在车顶上也放一些数据,让人觉得傻乎乎的。HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。
在我大万维网世界中,还有另一个重要的角色:运输公司。不同的浏览器(发起http请求)和服务器(接受http请求)就是不同的运输公司。 虽然理论上,你可以在车顶上无限的堆货物(url中无限加参数)。但是运输公司可不傻,装货和卸货也是有很大成本的,他们会限制单次运输量来控制风险(数据多了会掉,所以车顶是由容量限制的),数据量太大对浏览器和服务器都是很大负担。
业界不成文的规定是,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。超过的部分,恕不处理。
如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,虽然GET可以带request body,也不能保证一定能被接收到哦。
最大区别
GET产生一个TCP数据包;POST产生两个TCP数据包。
- 对于GET请求,浏览器会把header和data一并发送出去,服务器响应200(返回数据)
- 对于POST,浏览器先发送header,服务器返回100(临时响应,代表还没完呢),浏览器再发送data,服务器返回200(请求成功,返回数据)。
也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。
因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。
- GET与POST都有自己的语义,不能随便混用。
- 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差可忽略不计。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
- 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
原文链接:https://www.cnblogs.com/logsharing/p/8448446.html
TCP/IP网络模型
TCP/IP模型是互联网的基础,它是一系列网络协议的总称。这些协议可以划分为四层,分别为链路层、网络层、传输层和应用层。
链路层
- 功能:负责封装和解封装IP报文,发送和接受ARP/RARP报文等。
-
- 分类:
- 物理层:例如线路、无线电、光纤、信鸽、无线路由器
- 数据链路层:例如以太网、令牌环、HDLC、帧中继、ISDN、ATM、IEEE 802.11、FDDI、PPP
网络层(IP协议)
- 功能:负责路由以及把分组报文(一个数据可能被分成了多个数据包??)发送给目标网络或主机。
例如IP、ICMP、IGMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、 X.25
IP协议
IP协议主要解决网络路由和寻址问题
传输层(TCP和UDP存放的位置)
- 功能:负责对报文进行分组和重组,并以TCP或UDP协议格式封装报文。
例如TCP、UDP、RTP、SCTP、SPX、ATP、IL
应用层(用户进程)
-
功能:负责向用户提供应用程序,比如HTTP、FTP、Telnet、DNS、SMTP等。
-
分类
1. 会话层:解除或建立与别的接口的联系
2. 表示层:数据格式化、代码转化、数据加密
3. 应用层:文件传输、电子邮件、文件服务、虚拟终端(HTTP在这里)
说说TCP和UDP的区别(传输层协议)
原文链接:https://www.cnblogs.com/fundebug/p/differences-of-tcp-and-udp.html
TCP协议(Transmission传输 + Control控制 + Protocol协议)
TCP协议全称是传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议
TCP的三次握手(建立连接)
第一次:客户端向服务端发送连接请求报文段。该报文段中包含自身的数据通讯初始序号(SYN)。请求发送后,客户端便进入 SYN-SENT 状态。
第二次:服务端收到连接请求报文段后,如果同意连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序号(SYN + ACK),发送完成后便进入 SYN-RECEIVED 状态。
第三次:客户端收到连接同意的应答后,还要向服务端发送一个确认报文。客户端发完这个报文段后便进入 ESTABLISHED 状态,服务端收到这个应答(ACK)后也进入 ESTABLISHED 状态,此时连接建立成功。
TCP的四次挥手(断开连接)
TCP 是全双工的,在断开连接时两端都需要发送 FIN 和 ACK。
第一次:若客户端 A 认为数据发送完成,则它需要向服务端 B 发送连接释放请求。
第二次:B 收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明 A到B的连接已经释放,不再接收 A 发的数据了。但是因为 TCP 连接是双向的,所以 B仍旧可以发送数据给A。
第三次:B 如果此时还有没发完的数据会继续发送,完毕后会向 A 发送连接释放请求,然后 B便进入 LAST-ACK 状态。
第四次:A收到释放请求后,向B发送确认应答,此时 A 进入TIME-WAIT状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态。当 B 收到确认应答后,也便进入CLOSED状态。(不管B有没有收到,最后都会被关闭)
例子:文件传输
适用于要求可靠传输的应用,保证数据不会丢失的场景
UDP协议(User传输 + Data数据 + Protocol协议)
UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。
UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
UDP如何实现数据包的传输(面向无连接)
- 在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加一个 UDP 头标识下是 UDP 协议,然后就传递给网络层了
- 在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操作
有单播,多播,广播的功能
UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。
UDP是面向报文的
发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。因此,应用程序必须选择合适大小的报文
优点:
- 数据传输快
缺点:
- 数据容易丢失,UDP只会把想发的数据报文一股脑的丢给对方,并不在意数据有无安全完整到达
例子:电话会议
电话会议(严谨点,打电话可能走得不是网络哈),有时候网络延迟等故障,会导致说话卡卡的
区别
TCP的关键字
三次握手四次挥手、一对一通信、不丢失数据、面向字节流(拆分、组合数据包)
UDP的关键字
无连接、多对多通信、数据易丢失、面向报文(不拆分、不组合数据包)
HTTP与HTTPS的区别
HTTP(超文本传输协议)
是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
不安全(明文传输)
如果攻击者截取了Web浏览器和网站服务器之间的传输报文(就是数据包),就可以直接读懂其中的信息,如密码等敏感信息
无状态(什么是无状态)
- 协议对于事务处理没有记忆能力
- 对同一个url请求没有上下文关系
- 每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况
- 服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器
HTTPS(安全版的HTTP)
安全(SSL加密:SSL:Secure安全 + Sockets套接 + Layer层)
原理步骤
-
客户端要求SSL加密:客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
-
服务器把SSL公钥给客户端:Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。(私钥永远在服务器这边,给出去的都是公钥)
-
大家一起确定安全等级:客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
-
客户端把数据包加密后传给服务器:客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
-
服务器解密,取出数据包处理:Web服务器利用自己的私钥解密出会话密钥。
-
Web服务器利用会话密钥加密与客户端之间的通信。
什么是Socket(是传输层和应用层之间的一个抽象层)
我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址(ip协议在网络层)可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用来实现进程在网络中通信。
什么是TCP的长连接和短连接
TCP的保活机制(客户出故障的情况下,服务端可以主动断开TCP连接)
保活功能主要为服务器应用提供,服务器应用希望知道客户主机是否崩溃,从而可以代表客户使用资源。如果客户已经消失,使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,则服务器将应远等待客户端的数据,
作用(关键字:探测)
试图在服务器端检测到这种半开放的连接(客户端没反应的情况)。如果一个给定的连接在两小时内没有任何的动作,则服务器就向客户发一个探测报文段(探测响应),客户主机必须处于以下4个状态之一:
- 客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常的,服务器在两小时后将保活定时器复位。
- 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务端将不能收到对探测的响应,并在75秒后超时。服务器总共发送10个这样的探测 ,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。
- 客户主机崩溃并已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。
- 客户机正常运行,但是服务器不可达,这种情况与2类似,TCP能发现的就是没有收到探查的响应。
短连接(一次性使用)
我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接。client向server 发送消息,server回应client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是client先发起close操作。为什么呢,一般的server不会回复完client后立即关闭连接的,当然不排除有特殊的情况(就是保活机制)。从上面的描述看,短连接一般只会在client/server间传递一次读写操作
优点
管理起来比较简单:存在的连接都是有用的连接,不需要额外的控制手段
缺点
接口请求频繁造成资源浪费:如果Client请求频繁,在TCP的建立和关闭操作上浪费时间和带宽,造成资源的浪费
长连接(重复利用,需要限制每个客户端的最大长连接数)
接下来我们再模拟一下长连接的情况,client向server发起连接,server接受client连接,双方建立
连接。Client与server完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接
优点
- 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间
缺点
- 探测周期太长(2小时),响应太慢:客户端挂了,最差的情况下要等2小时,服务端才能去检测,关闭TCP连接
- 一直保持连接但啥事也不干,连接越来越多,导致Server资源被占满
解决
限制每个客户端的最大长连接数
TCP粘包是怎么产生的?怎么解决这个问题
原文链接:https://blog.csdn.net/weixin_41047704/article/details/85340311
什么是TCP粘包
TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方。
TCP粘包产生的原因(本质:TCP基于流的传输)
发送方原因(Nagle唠叨算法,什么名字这么搞笑)
TCP默认使用Nagle算法(主要作用:减少网络中报文段的数量),而Nagle算法主要做两件事:
- 只有上一个分组得到确认,才会发送下一个分组(看不懂,分组说的什么意思??TODO)
- 收集多个小分组,在一个确认到来时一起发送
接收方原因(应用方消费速度太慢,导致缓存积压,有种消息队列的内味了哈哈)
TCP接收到数据包时,并不会马上交到应用层进行处理(或者说应用层并不会立即处理)。实际上,TCP将接收到的数据包保存在接收缓存里,然后应用程序主动从缓存读取收到的分组。这样一来,如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。
如何处理
发送方(关闭Nagle唠叨算法)
关闭Nagle唠叨算法
接收方(处理不了)
处理不了,丢给应用层去处理
应用层(兜底了,随便处理)
为什么UDP不会产生粘包
UDP是基于报文(数据包)传输的,来多少包就传多少次包,不会混乱
如何实现跨域
什么是跨域
在浏览器同源策略限制下,向不同源(不同协议、不同域名或者不同端口)发送XHR请求,浏览器认为该请求不受信任,禁止请求,具体表现为请求后不正常响应
如何实现
- 代理:前端向发送请求,经过代理,请求需要的服务器资源
- 基于Html5 websocket协议:基于该协议可以做到浏览器与服务器全双工通信,允许跨域请求
TCP是如何保证消息不会丢失
TCP有一个特殊的机制来确保数据安全的不出错的从一个端点传到另一个端点
- 字节编号机制:编号机制很好理解,就是给TCP的数据段里面的数据部分 ,每个字节都进行编号。为什么需要编号?好说,就是为了更清楚的接收和发送。TCP数据是按序的,接收完之后按序组装好,才会交付给上层。
- 数据段的确认机制:保证问的问题,对方一定接收到,如果确实没有接收到就会重复去问
- TCP的超时重传机制:
HTTP和TCP/IP的区别
TPC/IP协议是传输层协议,主要解决数据包传输问题
HTTP是应用层协议,主要解决如何包装数据