文章目录
HTTP 协议
概述
在网络上的不同计算机之间必须使用相同的网络协议才能进行通信,HTTP(超文本传输协议)协议就是用于规范客户端浏览器和服务器以什么样的格式进行通信数据交互的,是属于应用层的面向对象的协议,适用于分布式超媒体信息系统。
HTTP协议由请求和响应构成,是一个标准的客户端服务器模型,也是一个无状态的协议。
主要特点:
- 支持客户/服务器模式
- 简单快速灵活:客户向服务器请求服务时,只需要传送请求方法和路径。请求方法常有get、post。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。HTTP允许传输任意类型的数据对象,正在传输的类型由Content—Type加以标记。
- 无连接:限制每次连接只处理一个请求,服务器处理完客户请求并且收到客户应答,即断开连接。可节省传输时间。
- 无状态:指协议对于事务处理没有记忆能力,意味着入伙后续处理需要前面的信息,则它必须重传,可能导致每次传送的数据量增大。
请求响应流程
浏览器向服务器发送 URL 地址,一个 URL 由几个不同的部分组成,每个部分都会为Web服务器如何处理来自客户端的 HTTP 请求提供一块基本的信息。
一个 URL (统一资源定位器)基本的结构:
http://www.njupt.edu.cn:80/默认首页
http:代表服务方式或协议,常见的如pop3、FTP等;
//:后面的通常是主机地址和端口号的组合,主机地址可以是域名,如“www.nujpt.edu.cn”,也可以直接是主机的 IP 地址,端口号没有指定,则默认是80;
/:后面的字符串表示资源的具体地址,在实际开发中常常加密,或者不显示。
- 注意:如果 URL 中使用的是域名,而客户端向服务器端通信必须获取服务端的 IP 地址,这时在客户端与服务器之间就需要一个代理服务器DNS(域名服务器),进行域名和与之相应的 IP 地址转换。
在Web开发中请求操作通常叫做request,相应操作通常叫做response。
客户端和服务器在发送请求和做出响应时都是从Socket对象中获取对方的 IP 地址和端口号,Socket中的信息以报文形式进行发送。
HTTP协议中的信息格式以报文(有一定格式的字符串,这里的格式需要遵循HTTP协议规范)的形式呈现。
HTTP请求报文和响应报文
-
请求报文:由4部分组成–请求行(request line)、请求消息头(headers)、空行(blank line)、请求体(request body)
-
请求行:位于请求消息第一行,包括3各部分–请求方式、资源路径、所使用的HTTP协议版本
请求方式:HTTP协议中主要是 GET 和 POST
GET:当用户在浏览器地址栏中直接输入某个URL地址或单击网页上的一个超链接时,浏览器默认使用 GET 方式发送请求。
POST:若网页上的form表单的method属性设置为“post”,那么就会以 POST 方式发送请求。
注意:由于GET请求方式的参数信息都会在URL地址栏里明文显示,而POST请求方式传递的参数隐藏在实体内容中,用户不可见,较于GET方式更为安全。因此在实际开发中,大多使用POST。
-
请求消息头:由关键字/值对组成,每行一对。作用是通知服务器有关于客户端请求的信息。
-
空行:在最后一个请求头之后,发送回车符和换行符,通知服务器一下不再有请求头。
-
请求体:其内容就是请求数据,请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。
-
-
响应报文:由4部分组成–状态行(status line)、相应消息头(Headers)、空行(blank line)、响应体(response body)
HTTP协议相关技术补充
高层协议:文件传输协议FTP、电子邮件传输协议SMTP、域名系统服务DNS、网络新闻传输协议NNTP
中介:代理(Proxy)、网关(Gateway)、通道(Tunnel)
- 代理:一个中间程序,可以充当服务器,也可以充当客户机,为其他客户机建立请求。一个代理根据 URI 的绝对格式来接受请求,重写部分或全部信息,通过 URI 的标识把已格式化的请求发送到服务器。
- 网关:一个作为其他服务器中间媒介的服务器。
- 通道:作为两个连接中继的中介程序,一旦激活便被认为不属于HTTP通信。当被中继的连接两端关闭时,通道便消失。
HttpServletResponse和HttpServletRequest
这两个是Java专门处理Http请求的类,HttpServletResponse代表对象服务器的响应,HttpServletRequest代表客户端的请求。
-
Response常见应用:
- 实现请求重定向:一个Web资源收到客户端请求后,通知客户端去访问另一个Web资源
- 实现方式:response.sendRedirect()
-
Request常见方法:
-
获取客户端信息:
方法名 作用 getRequestURL 返回请求的完整URL getRequestURI 返回请求的资源名部分 getQueryString 返回请求的参数部分 getPathInfo 返回URL中的额外路径信息(位于Servlet路径之后和查询参数之前的内容,以/开头) getRemoteAddr 返回客户机使用的IP getRemoteHost 返回客户机使用的主机名 getRemotePort 返回客户机使用的网络端口号 getLocalAddr 返回web服务器的IP getLocalName 返回web服务器的主机名 -
获取客户端请求参数(客户端提交的数据)
方法名 作用 getParameter(String name) 获取前端表单单个元素name对应的value值 getParameterValues(String name) 获取前端表单多个标签同名name对应的所有value值 getParameterNames(String name) 获取前端表单所有标签元素name的对应的所有value值 getParameterMap 返回Map型的值
-
请求转发和重定向
-
请求转发:服务器将未处理完的请求直接交给后端另一块模块处理,整个请求被处理完之后才返回结果给客户端。
使用:request.getRequestDispatcher().forward();
-
重定向:服务器告诉客户端(给了客户端一个session id)再去请求另一个页面/资源。
使用:response.sendRedirect()
OSI 模型
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
TCP / IP 模型
- 应用层:HTTP、SMPT(简单电子邮件传输)、FTP(文件传输)
- 传输层:TCP、UDP
- 网络层:IP
- 数据链路层
TCP 三次握手、四次挥手
-
三次握手:客户端请求服务器连接。
- 客户端发送一个带有 SYN =1 标志的请求,同时随机生成一个 seq 序列号
- 服务端收到后,发送一个确认标志 ACK =1 和确认序列号 ack = seq+1,同时发送一个 SYN =1 标志以及序列号 seq 给客户端。这时,对客户端来说,收发消息都没有问题。但是,对服务器来说,仅仅是收到了客户端的连接请求,不能确认客户端是否收到了确认回应
- 第三次握手,客户端发送 ACK 确认标志以及序列号 ack
-
四次挥手:客户端请求服务器断开连接。
- 客户端发送一个 FIN =1 的标志以及序列号 seq 给服务端
- 这个时候服务端可能还有数据没有传输结束,所以只是给客户端发送一个确认标志 ACK 和序列号
- 等传输完所有数据之后,服务器会发送一个 FIN =1 标志以及 seq 序列号给客户端,表示可以断开连接
- 客户端再发送一个确认标志 ACK = 1 以及序列号给服务端,断开连接
-
TCP VS UDP
-
- TCP:面向连接,可靠传输,字节流传输形式,效率低,所需资源多,要求数据安全时使用
- UDP:无连接,不可靠,数据报文段传输形式,效率高,所需资源少,要求通信速度高时使用