计算机网络

it2022-05-05  131

HTTP简介

它是位于应用层的协议.是基于请求-响应模型的无状态的协议.中文名为超文本传输协议.基于TCP协议.HTTP协议定义了web客户端如何从web服务器请求web页面以及服务器如何把web页面传送给客户端.

HTTP协议的主要特点:

支持客户端/服务器模式(客户端向服务器发送请求,服务器根据请求向客户端发送响应信息).简单快速: 客户端发出请求的时候只需要传送请求方法(get/post等)和路径即可.灵活: HTTP允许传输任意类型的数据对象,传输类型由contentype加以标记.无连接,也就是说,每次连接只处理一个请求,服务端完成客户端的请求并受到客户端的确认后就会断开连接(HTTP1.1之后就换成了长连接,即连接一段时间才会断开连接).无状态,即协议对于事务处理没有记忆能力,同时也意味着如果后续处理需要前面的处理信息就只能被重传.

HTTP请求报文结构(包括请求行,请求头和请求体三部分):

请求行: 包括请求方法+空格+URL+空格+协议版本,例如GET /index.html HTTP/1.1.请求头: 由若干个头部字段名 + : + 值组成.用于通知服务器有关于客户端请求的信息,常见的头部字段名如下. User-Agent:产生请求的浏览器类型,例如User-Agent: Chrome/74.0.3729.169 Safari/537.36.Accept:客户端可识别的内容类型列表,例如Accept: text/html.Host:请求的主机名,例如Host: www.baidu.com. 请求体不在GET方法中使用,而是在POST方法中使用.

HTTP响应报文结构(包括状态行,响应头和响应体三部分):

状态行: 包括协议版本+空格+状态码+空格+状态码描述,例如HTTP/1.1 200 OK.响应头: 和请求头一样,用于告知客户端服务端的信息,由多个头部字段名+空格+值组成,例如Content-Type: text/html;charset=utf-8.响应体: 返回的就是客户端请求的数据.

HTTP协议中请求和响应的步骤:

客户端连接到web服务器发送HTTP请求(文本请求)服务器接收到请求并返回HTTP响应消息释放TCP连接客户端浏览器解析HTML内容

在浏览器地址栏输入URL,按下回车后经历的流程

DNS(域名系统)解析:即将主机名(如www.sina.com或者mail.163.com)转换为对应的ip地址.根据IP地址和端口(端口用于确认是哪个进程,默认是80)和服务器建立TCP连接(三次握手).向服务器发送HTTP请求.服务器处理请求并返回HTTP响应报文.浏览器解析响应报文并渲染页面.浏览器释放TCP连接(四次挥手).

HTTP状态码(五种)

1xx: 指示信息—表示请求已接收,继续处理.2xx: 成功—表示请求已被成功接收,理解,接收.例如200表示请求已成功,请求所希望的响应头或数据体将随此响应返回.3xx: 重定向—表示客户端要完成请求必须进行更进一步的操作.4xx: 客户端错误—表示请求有语法错误或请求无法实现(比如请求参数有误).5xx: 服务端错误—服务器端未能实现合法的请求.

常见状态码

200 OK: 正常返回信息.400 Bad Request: 客户端请求有语法错误,不能被服务器所理解.401 Unauthorized: 请求未经授权,这个状态码必须和WWW-Authenticate一起使用.403 Forbidden: 服务器收到请求,但是拒绝提供服务.404 Not Found: 请求资源不存在,例如输入了错误的URL.500 Internal Server Error: 服务器发生了不可预知的错误.503 Server Unavailable: 服务器当前不能处理客户端的请求,可能会在一段时间后恢复正常.

GET请求和POST请求的区别

从HTTP报文层面: GET将请求信息放在URL中,POST将请求信息放在请求体中.因此浏览器在GET请求中会对数据长度进行一定限制,而对POST请求没有限制,注意:HTTP是不安全的,不管是什么方式,通过抓包都是可以抓到数据这点可以体现.从数据库层面: GET请求(主要做查询操作)符合幂等性(对数据库的一次操作和多次操作的结果是一致的)和安全性(对数据库的操作不改变数据库中的数据),POST不符合(因为它主要用于修改,会向服务器提交数据,比如我们的登录就是用的post).从其他层面: GET请求可以被缓存(例如参数会保存在浏览器的浏览记录中,这也是get请求被广泛应用的根本),被存储(例如get请求的url可以被保存为书签),但是POST请求都不可以.

因为http是无状态的,那么我们每次请求的时候都需要输入账号密码,但是实际上我们并没有这样子,那么因为有某种操作记住了我们的状态,其中就有cookie和session

Cookie简介

Cookie: 作用在客户端,即服务器发送给客户端的特殊信息,以文本形式存放在客户端,客户端每次给服务器端发送请求的时候,都会带上这些特殊的信息.

例如:

当我们用浏览器访问一个支持Cookie的网站的时候,如果我们提交了账号密码等信息至服务器,服务器在处理完我们发送的请求并回传响应文本的同时,也会带上这些我们提交的个人信息,但是这些信息不存放在响应体,而是存放在响应头中,当浏览器接收到服务器的响应消息后,浏览器会将这些信息存放在一个统一的位置.有了上面的一系列操作之后,当客户端再次向服务端发起请求的时候,会把相应的Cookie存放在HTTP请求头中发回给服务器.当服务器再次收到请求后,会解析Cookie中的信息,并生成与客户端相对应的内容(例如记住密码之类的提醒,选中之后,下次就不用再重新登录了).

Cookie设置及发送过程

客户端发送http请求给服务器.服务器处理请求并返回响应消息给客户端,其中响应消息的响应头中包含了Set-Cookie这个字段值的信息,例如 Set-Cookie: rememberMe=deleteMe; Path=/xg; .客户端再次发送http请求到服务器,其中请求报文的请求头中包含了Cookie字段值 的信息,例如 Cookie: JSESSIONID=GQnkdx.服务器给客户端发出一个HTTP响应,比如问是否记住密码之类的,点击记住密码后,客户端再次登录就不需要输入密码了.其实有的是会第一次登录就提醒你是否记住密码,但是流程都差不多.

Session简介

服务器端的机制,在服务器上保存的信息.当服务器需要为某个客户端的请求创建一个session的时候,它会先检查客户端的请求里是否已包含了jsessionid这个字段,如果有,则说明以前为此客户端创建过session,它就会解析jsessionid这个字段值,检索其对应的session并使用.如果请求中没有jsessionid这个字段或者检索不到传来的jsessionid对应的session,那么服务器就会为此客户端新创建一个session,同时生成一个与之相关的jsessionid(不会重复,也不容易破解的字符串),这个id会随着响应信息发送给客户端进行保存.

Session的实现方式

使用Cookie来实现 服务器给每个session分配一个唯一的jsessionid,并通过cookie发送给客户端(放在响应头中的set-cookie字段中),当客户端发起新的请求的时候,将在cookie字段中携带这个jsessionid,这样服务器就能找到客户端对应的session.

使用URL回写来实现

URL回写是指服务器在发送给浏览器页面的所有链接中,都会携带jsessionid这个参数及其值,这样客户端点击任何一个链接都会把jsessionid带回到服务器中.

如果直接在浏览器地址栏输入服务器资源对应的URL来请求资源,那么存放在服务器中的session是匹配不到的,因为没有jsessionid字段及其值.

tomcat对session的实现: 一开始同时使用回写url和cookie,如果发现客户端支持cookie,就继续使用cookie而停止使用url回写,如果不支持cookie或者cookie被禁用,就只使用url回写.

Cookie请求和Session的区别

Cookie存放在客户端浏览器上,而Session存放在服务器端.Session相对于Cookie更安全(Cookie存放在本地,可以自己伪造).Session由于保存在服务器上,当访问增多会占用服务器的性能,考虑到减轻服务器负担,应当使用Cookie.Cookie只能保存字符串类型对象,而Session中可以保存任意类型的对象.单个Cookie的容量大小一般为4KB,Session没有容量限制.

最新回复(0)