一.HTTP

1.http

HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol),HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范

HTTP 主要内容分为三部分,超文本(Hypertext)、传输(Transfer)、协议(Protocol)

(1)超文本:超文本就是不单单只是本文,它还可以传输图片、音频、视频,甚至点击文字或图片能够进行超链接的跳转

(2)传输:传输就是数据需要经过一系列的物理介质从一个端系统传送到另外一个端系统的过程。通常我们把传输数据包的一方称为请求方,把接到二进制数据包的一方称为应答方

(3)协议:网络中(包括互联网)传递、管理信息的一些规范

2.https

是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。它其实就是 HTTP + SSL 协议组合而成

3.http和https区别

(1)最简单的,HTTP 在地址栏上的协议是以 http:// 开头,而 HTTPS 在地址栏上的协议是以 https:// 开头

(2)HTTP 是未经安全加密的协议,它的传输过程容易被攻击者监听、数据容易被窃取、发送方和接收方容易被伪造; HTTPS 是安全的协议,它通过 密钥交换算法 - 签名算法 - 对称加密算法 - 摘要算法 能够解决上面这些问题

(3)HTTP 的默认端口是 80,而 HTTPS 的默认端口是 443

4.http get和post的区别

(1)get 方法一般用于请求资源,post方法一般用于提交表单

(2)get 方法是不安全的,因为你在发送请求的过程中,你的请求参数会拼在 URL 后面,从而导致容易被攻击者窃取,对你的信息造成破坏和伪造; post 方法是把参数放在请求体 body 中的,这对用户来说不可见

(3)get 请求的 URL 有长度限制,而 post 请求会把参数和值放在消息体中,对数据长度没有要求

(4)get 请求会被浏览器主动 cache,而 post 不会,除非手动设置

(5)get 请求在发送过程中会产生一个 TCP 数据包;post 在发送过程中会产生两个 TCP 数据包。对于 get 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据);而对于 post,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)

5.什么是无状态协议,HTTP 是无状态协议吗

对交互场景没有记忆能力。无论哪个客户端请求,都返回相同的资源。可以通过其它技术使HTTP保持状态(cookie和session)

6.session和cookie的区别

(1).session 在服务器端,cookie 在客户端(浏览器)

(2).session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效

(3).单个cookie保存的数据<=4KB,一个站点最多保存20个Cookie。对于session来说并没有上限

7.禁用cookie,还想用session?

url重写。在响应消息的实体内容中必须包含下一次请求的超链接, 将sessionid作为超链接的URL地址的一个特殊参数

二.TCP和UDP

1.UDP

1.基本概念

UDP ,用户数据报协议。它不需要所谓的握手操作,从而加快了通信速度,允许网络上的其他主机在接收方同意通信之前进行数据传输

2.特点

(1)UDP 能够支持容忍数据包丢失的带宽密集型应用程序(视频直播)

(2)UDP 具有低延迟的特点

(3)UDP 能够发送大量的数据包

(4)UDP 能够允许 DNS 查找,DNS 是建立在 UDP 之上的应用层协议

2.TCP

1.基本概念

TCP传输控制协议。它能够帮助你确定计算机连接到 Internet 以及它们之间的数据传输。通过三次握手来建立 TCP 连接,三次握手就是用来启动和确认 TCP 连接的过程。一旦连接建立后,就可以发送数据了,当数据传输完成后,会通过关闭虚拟电路来断开连接

2.特点

(1)TCP 能够确保连接的建立和数据包的发送

(2)TCP 支持错误重传机制

(3)TCP 支持拥塞控制,能够在网络拥堵的情况下延迟发送

(4)TCP 能够提供错误校验和,甄别有害的数据包。

3.TCP和UDP区别

4.三次握手

(一).流程

(1)客户端发送一个syn到服务器,序列号x

(2)服务器收到syn后,发送一个syn-ack作为答复,确认号x+1,序列号y

(3)客户端收到syn+ack后,发送一个ack,确认号y+1

(二).实例

小明给小红打电话,接通了后,小明说喂,能听到吗,这就相当于是连接建立。

小红给小明回应,能听到,你能听到我说的话吗,这就相当于是请求响应。

小明听到小红的回应后,好的,这相当于是连接确认。在这之后小明和小红就可以通话/交换信息了

5.四次挥手

(一).流程

(1)首先,客户端应用程序决定要终止连接(这里服务端也可以选择断开连接)。这会使客户端将 FIN 发送到服务器,并进入 FIN_WAIT_1 状态

(2)当服务器收到 FIN 消息时,服务器会立刻向客户端发送 ACK 确认消息,客户端就进入 FIN_WAIT_2 状态,然后等待来自服务器的 FIN 消息

(3)服务器发送 ACK 确认消息后,一段时间(可以进行关闭后)会发送 FIN 消息给客户端,告知客户端可以进行关闭

(4)当客户端收到 FIN 消息时,就会由 FIN_WAIT_2 状态变为 TIME_WAIT 状态。处于 TIME_WAIT 状态的客户端允许重新发送 ACK 到服务器为了防止信息丢失。客户端在 TIME_WAIT 状态下花费的时间取决于它的实现,在等待一段时间后,连接关闭,客户端上所有的资源(包括端口号和缓冲区数据)都被释放。

(二).实例

小明对小红说,我所有的东西都说完了,我要挂电话了。

小红说,收到,我这边还有一些东西没说。

经过若干秒后,小红也说完了,小红说,我说完了,现在可以挂断了

小明收到消息后,又等了若干时间后,挂断了电话

6.为什么是三次握手?

确保双方都有收发数据的能力

7.为什么是四次挥手?

关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接

三.http进阶

1.输入url到响应,经历了哪些过程?

(1)dns查询

①首先去本地dns缓存查询,如果查到,直接返回ip

②查询host文件是否配置ip

③按本地dns服务器(ISP域:互联网服务提供商)—>根域名服务器(www) -> 顶级域名服务器(com edu) -> 权威 DNS 服务器(baidu.com)后

(2)浏览器和目标服务器建立tcp连接(三次握手)

(3)请求和传输数据(HTTP 1.1 后默认使用长连接,只需要一次握手即可多次传输数据)

2.简述 HTTP1.0/1.1/2.0 的区别

(1)http1.0

HTTP 1.0 是在 1996 年引入的,从那时开始,它的普及率就达到了惊人的效果。

HTTP 1.0 仅仅提供了最基本的认证,这时候用户名和密码还未经加密,因此很容易收到窥探。

HTTP 1.0 被设计用来使用短链接,即每次发送数据都会经过 TCP 的三次握手和四次挥手,效率比较低。

HTTP 1.0 不支持断点续传,也就是说,每次都会传送全部的页面和数据。

(2)HTTP1.1

HTTP 1.1 是 HTTP 1.0 开发三年后出现的,也就是 1999 年,它做出了以下方面的变化

HTTP 1.1 使用了摘要算法来进行身份验证

HTTP 1.1 默认使用长连接,长连接就是只需一次建立就可以传输多次数据,传输完成后,只需要一次切断连接即可。长连接的连接时长可以通过请求头中的 keep-alive 来设置

HTTP 1.1 支持断点续传,通过使用请求头中的 Range 来实现。

(3)HTTP2.0

HTTP 2.0 是 2015 年开发出来的标准

头部压缩,由于 HTTP 1.1 经常会出现 User-Agent、Cookie、Accept、Server、Range 等字段可能会占用几百甚至几千字节,而 Body 却经常只有几十字节,所以导致头部偏重。HTTP 2.0 使用 HPACK 算法进行压缩

二进制格式,HTTP 2.0 使用了更加靠近 TCP/IP 的二进制格式,而抛弃了 ASCII 码,提升了解析效率

多路复用,就是在一个 TCP 连接中可以发送多个请求

随机推荐

  1. Vue 分支循环

    分支循环 在Vue中,分支循环也是使用标签属性指令完成的,这一点与后端模板语法不太相同. v-for 下面是通过v-for进行循环,不光可以拿到元素本身,也可以拿到索引值. 如果数据是对象类型,则可以 ...

  2. 关于人人开源renren-fast-vue 中npm install各种报错的解决方案

    首先吐槽一下,因为这个问题我整了好几天,把报错信息复制百度,试遍了各种方法,node.js我是卸载了安装,安装了卸载,甚至renren-fast-vue我也删了再下,然后再删,无限循环.然而没有什么软 ...

  3. mybatis进行mapper.xml测试的时候发生"必须为元素类型 “mapper” 声明属性 “namespace”

    1.Caused by Caused by: org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 45; 必须为元素类型 " ...

  4. C++实现职工管理系统(下)

    C++实现职工管理系统(下) 大家好,今天是在博客园的第十五天,博主今天给大家带来的是职工管理系统(C++)(下) 这次的随笔记录是实现(中)结语处说的几个功能,另外新增一个修改功能 此次要实现的功能 ...

  5. 基于mockito做有效的单元测试

    概述 本文讲解的主要是有效和单元的思想,并不是说如何编写单元测试,用于改善和提高开发效率.编码风格.编码可读性和单测效率,不盲目追求覆盖率. 背景 现在很多单元测试只是利用@Test注解把代码或者整个 ...

  6. linux上部署springboot项目

    1.安装jdk,请参考个人博客linux安装jdk 2.安装mysql,请参考个人博客 linux安装mysql 3.项目打包(使用idea) 打开项目,点击idea右边Maven Projects菜 ...

  7. Java基础——缓存

    1.缓存 将程序或系统中常用的数据对象存储在像内存这样特定的介质中,以避免在每次程序调用时,重新创建或组织数据所带来的性能损耗,从而提高了系统的整体运行速度 以目前的系统架构来说,用户的请求一般会先经 ...

  8. 欧拉函数线性求解以及莫比乌斯反演(Mobius)

    前言 咕咕了好久终于来学习莫反了 要不是不让在机房谁会发现数学一本通上有这么神奇的东西 就是没有性质的证明 然后花了两节数学课证明了一遍 舒服- 前置知识:欧拉函数,二项式定理(组合数) 会欧拉函数的 ...

  9. Java知识系统回顾整理01基础05控制流程06break

    一.break break:结束循环 二.练习--直接结束当前for循环 public class HelloWorld { public static void main(String[] args ...

  10. Java知识系统回顾整理01基础06数组06二维数组

    一.一维数组和二维数组 这是一个一维数组, 里面的每一个元素,都是一个基本类型int int a[] =new int[]{1,2,3,4,5}; 这是一个二维数组,里面的每一个元素,都是一个一维数组 ...