文章目录
HTTP报文由哪三部分组成?
- HTTP报文由起始行(start line)、头部(header)和主体(body)三部分组成,起始行是对报文进行的描述,头部包含报文的一些属性,主体包含报文的数据(可选,非必选)。
HTTP报文分为哪两类?
- HTTP报文可以分为:请求报文(request message)和响应报文(response message)。当客户端向服务端发送请求时,就是发送请求报文;当服务端向客户端返回数据时,就是返回响应报文。
Http与Https的区别:
- HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头
- HTTP 标准端口是80 ,而 HTTPS 的标准端口是443
- HTTP 无法加密,而HTTPS 对传输的数据进行加密,所以https是安全的,http是不安全的。
- HTTP无需证书,而HTTPS 需要CA机构wosign的颁发的SSL证书
URI和URL的区别
URI统一资源标识符
Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的,URI一般由三部组成:
- ①访问资源的命名机制
- ②存放资源的主机名
- ③资源自身的名称,由路径表示,着重强调于资源。
URL统一资源定位器,
- 它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
- URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:
①协议(或称为服务方式)
②存有该资源的主机IP地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等
一次完整的HTTP请求所经历的7个步骤
1:建立TCP连接
- Web浏览器首先要通过网络与Web服务器通过TCP建立连接,
2:Web浏览器向Web服务器发送请求行
- 一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET /sample/hello.jsp HTTP/1.1。
3:Web浏览器发送请求头
- 浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,然后浏览器发送一空白行来通知服务器,它已经结束了该头信息的发送。
4:Web服务器应答
- 浏览器向服务器发出请求后,服务器会客户机回送应答,HTTP/1.1 200 OK。
5:Web服务器发送应答头
- 正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
6:Web服务器向浏览器发送数据
- Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。
7:Web服务器关闭TCP连接
- 一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,
- 如果浏览器或者服务器在其头信息加入了Connection:keep-alive这行代码,
- TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
- 建立TCP连接->发送请求行->发送请求头->(到达服务器)发送状态行->发送响应头->发送响应数据->断TCP连接
五层协议
应用层
- 应用层协议定义的是应用进程间的通信和交互的规则。在互联网中应用层协议很多,如域名系统DNS,支持万维网应用的 HTTP协议,支持电子邮件的 SMTP协议等等。
运输层
- 负责向两台主机进程之间的通信提供通用的数据传输服务。传送应用层报文。
运输层主要使用以下两种协议:
1:传输控制协议TCP:提供面向连接的,可靠的数据传输服务。
2:用户数据协议UDP:提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。
网络层
- 选择合适的网间路由和交换结点, 确保数据及时传送。 在发送数据时,网络层把运输层产生的报文段或用户数据封装成 分组 和 包 进行传送。
数据链路层
- 两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。在两个相邻的节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。
物理层
- 在物理层中传输的数据的单位为比特,物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。
TCP三次握手四次挥手
三次握手
- 1:客户端–>发送带有SYN标志的数据包(一次握手)–>服务端
- 2:服务端–>发送带有 SYN/ACK 标志的数据包(二次握手)–>客户端
- 3:客户端–>发送带有带有 ACK 标志的数据包(三次握手)–>服务端
为什么要三次握手
- 第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常
- 第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常
- 第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常
四次挥手
- 第一次挥手:客户端关闭连接的请求
- 第二次挥手:服务端收到断开连接的请求后需要对关闭请求进行确认,于是给客户端发送一个消息—(你确定要关闭吗)
- 第三次挥手:在发送确认消息后再向客户端发送close消息,关闭链接。
- 第四次挥手:客户端接收到消息之后,进入到time_wait状态,客户端接收到消息之后。对消息的确认。
tcp和udp的区别*
Tcp:
- 面向连接的流传输控制协议,具有高可靠性,确保传送数据的准确性,有验证重发机制,因此不会丢失或者乱序
Udp:
- 是无连接的数据服务,不对数据进行检查与修改,无需等待对方应答,可能出现分组丢失,重复,乱序,但是具有很好的实时性,网络开销比tcp小。
cookie与session的作用以及区别
- Cookie:Cookie 一般用来保存用户信息
- Session:Session 的主要作用就是通过服务端记录用户的状态
- Cookie数保存在客户端(浏览器端),session数据保存在服务端,
- Cookie 存储在客户端中,而Session存储在服务器上,相对来说 Session 安全性更高。
基于TCP的Socket网络编程的主要步骤是什么?
服务器端(server):
- 构建一个ServerSocket实例,指定本地的端口。这个socket就是用来监听指定端口的连接请求的。
- 重复如下几个步骤:
a. 调用socket的accept()方法来获得下面客户端的连接请求。通过accept()方法返回的socket实例,建立一个和客户端的新连接。
b.通过这个返回的socket实例,获取InputStream和OutputStream,可以通过这两个stream来分别读和写数据。
c.结束的时候调用socket实例的close()方法关闭socket连接。
客户端(client):
- 1.构建Socket实例,通过指定的远程服务器地址和端口来建立连接。
- 2.通过Socket实例包含的InputStream和OutputStream来进行数据的读写。
- 3.操作结束后调用socket实例的close方法,关闭。
基于UDP的Socket网络编程的主要步骤是什么?
- 基于UDP协议的Socket编程的主要步骤
服务器端(server):
- 构造DatagramSocket实例,指定本地端口。
- 通过DatagramSocket实例的receive方法接收DatagramPacket.DatagramPacket中间就包含了通信的内容。
- 通过DatagramSocket的send和receive方法来收和发DatagramPacket.
客户端(client):
- 构造DatagramSocket实例。
- 通过DatagramSocket实例的send和receive方法发送DatagramPacket报文。
- 结束后,调用DatagramSocket的close方法关闭。
如何实现跨域请求?
jsonp
- 利用了 script 不受同源策略的限制
- 缺点:只能 get 方式,易受到 XSS攻击
CORS(Cross-Origin Resource Sharing),跨域资源共享
- 当使用XMLHttpRequest发送请求时,如果浏览器发现违反了同源策略就会自动加上一个请求头 origin;
- 后端在接受到请求后,在 Response Headers 中加入一个属性 Access-Control-Allow-Origin;
- 浏览器判断响应中的 Access-Control-Allow-Origin 值是否和当前的地址相同,匹配成功后才继续响应处理,否则报错。
- 缺点:忽略 cookie,浏览器版本有一定要求
代理跨域请求
- 前端向发送请求,经过代理,请求需要的服务器资源
- 缺点:需要额外的代理服务器
说明socket是什么?
- 这个接口就是套接口(Socket)。
- Socket:可以看作用户进程和内核网络协议栈编程(交互)接口
- Socket:不仅可以在同一台主机上进行通信,也可以在网络上不同的主机间进行通信,也可以在不同的软硬件平台进行通信
过滤器(Filter)、.监听器(Listener)、拦截器(Interceptor)
1.过滤器(Filter):
- 所谓过滤器顾名思义是用来过滤的,Java的过滤器能够为我们提供系统级别的过滤,也就是说,能过滤所有的web请求,这一点,是拦截器无法做到的。
- 在Java Web中,传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者controller层进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者controller层前统一设置字符集,或者去除掉一些非法字符(聊天室经常用到的,一些骂人的话)。
- filter 流程是线性的,url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收。
2.监听器(Listener):
- Java的监听器,也是系统级别的监听。监听器随web应用的启动而启动。Java的监听器在c/s模式里面经常用到,它会对特定的事件产生一个处理。
- 监听在很多模式下用到,比如说观察者模式,就是一个使用监听器来实现的,在比如统计网站的在线人数。又比如struts2可以用监听来启动。
- Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。
3.拦截器(Interceptor):
- java里的拦截器提供的是非系统级别的拦截,也就是说,就覆盖面来说,拦截器不如过滤器强大,但是更有针对性。Java中的拦截器是基于Java反射机制实现的,更准确的划分,应该是基于JDK实现的动态代理。
- 它依赖于具体的接口,在运行期间动态生成字节码。拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。
- 在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截然后再之前或者之后加入某些操作。java的拦截器主要是用在插件上,扩展件上比如 Hibernate Spring Struts2等,有点类似面向切片的技术,在用之前先要在配置文件即xml,文件里声明一段的那个东西。
说一下 tcp 粘包是怎么产生的?
①. 发送方产生粘包
- 采用TCP协议传输数据的客户端与服务器经常是保持一个长连接的状态,双方在连接不断开的情况下,可以一直传输数据;但当发送的数据包过于的小时,那么TCP协议默认的会启用Nagle算法,将这些较小的数据包进行合并发送(缓冲区数据发送是一个堆压的过程);这个合并过程就是在发送缓冲区中进行的,也就是说数据发送出来它已经是粘包的状态了。
②. 接收方产生粘包
- 接收方采用TCP协议接收数据时的过程是这样的:数据到底接收方,从网络模型的下方传递至传输层,传输层的TCP协议处理是将其放置接收缓冲区,然后由应用层来主动获取,这时会出现一个问题,就是我们在程序中调用的读取数据函数不能及时的把缓冲区中的数据拿出来,而下一个数据又到来并有一部分放入的缓冲区末尾,等我们读取数据时就是一个粘包。(放数据的速度 > 应用层拿数据速度)
如何实现会话跟踪,有哪些技术
- 1:cookie:
向客户端发送用cookie.set,从客户的读取用cookie.getval
优点:数据可以持久保存,不需要服务器资源,简单,基于文本的key–value
缺点:大小受到限制,而且用户可以禁用cookie功能,由于保存在本地,有一定的风险 - 2:url重写:
在url中添加用户会话的信息作为请求的参数,或者将唯一的会话ID添加到url的结尾以标识一个会话。
优点:在cookie被禁用是仍然可以使用
缺点:必须对网站的url进行编码,所有的页面必须动态生成,不能用预先记录下来的URL进行访问。 - 3:隐藏的表单域:
优点:cookie被禁用是可以使用
缺点:所有页面必须是表单提交之后的结果 - 4:HttpSession:
当一个用户第一次访问一个网站时会自动创HttpSession,每个用户可以访问他自己的HttpSession。通过HttpServletRequest对象的getSession方法获得HttpSession,通过HttpSession的setAttribute方法可以将一个值放在HTTPSession中,通过getAttribute的方法,同时传入属性名就可以获取保存在HttpSession中的对象。
jsp有哪些内置对象、作用分别是什么
- 1:request:封装客户端的请求,其中包含来自get和post请求的参数。
- 2:response:封装服务器对客户端的响应。
- 3:pageContext:通过该对象可以获取其他的对象
- 4:session:封装用户会话的对象
- 5:application:封装服务器运行环境的对象
- 6:out:输出服务器响应的输出流对象
- 7:config:Web应用的配置对象
- 8:page:jsp页面本身(相当于java中的this)
- 9:exception:封装页面抛出异常的对象
jsp中四种作用域
- Jsp中的四种作用域包括page、request、session和application
Page:
- 代表与一个页面相关的对象和属性
Request:
- 代表与web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个web组件,需要在页面显示的临时数据可以置于此作用域。
Session:
- 代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据都放在用户自己的session中。
Application:
- 代表与整个web应用程序相关的对象和属性。它的实质上是跨越整个web应用程序,包括了多个页面、请求和会话的一个全局作用域。