pppenger.github.io

目录

OSI七层模型TCP/IP五层模型每层对应工作设备每层主要协议TCPtcp flagsTCP三次握手首次握手隐患---SYN超时建立连接后,Client出现故障怎么办TCP四次挥手为什么会有TIME_WAIT状态?服务器出现大量CLOSE_WAIT状态的原因?UDPUDP的特点HTTPHTTP 请求:HTTP请求结构HTTP 响应:HTTP状态码键入URL,经历的流程会话跟踪常用方法:CookieSession什么时候创建sessionsession什么时候失效?一个 TCP 连接上面能发多少个 HTTP 请求GET请求和POST请求的区别JSON

 

 

https://zhuanlan.zhihu.com/p/24913080

OSI七层模型

https://www.cnblogs.com/qishui/p/5428938.html

img

TCP/IP五层模型

img

每层对应工作设备

img

每层主要协议

img

 

TCP

tcp flags

URG:紧急指针标志 ACK:确认序号标志 PSH:push标志 RST:重置连接标志 SYN:同步序号,用于建立连接过程 FIN:finsish标志,用于释放连接

TCP三次握手

流程: 第一次握手,建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到SYN包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手

首次握手隐患---SYN超时

问题起因:

server收到client的SYN,回复SYN-ACK的时候未收到ACK确认; server不断重试直至超时,Linux默认等待63秒才短开连接

针对SYN Flood的防护措施

SYN队列满后,通过tcp_syncookies参数回发SYN Cookie

若为正常连接则Client会回发SYN Cookie,直接建立连接

建立连接后,Client出现故障怎么办

保活机制

向对方发送保活探测报文,如果未收到响应则继续发送 尝试次数达到保活探测数仍未收到响应则中断连接

TCP四次挥手

第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态;

第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态;

第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态;

第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSERD状态,完成四次挥手;

为什么会有TIME_WAIT状态?

确保有足够的时间让对方收到ACK包 避免新旧连接混淆

服务器出现大量CLOSE_WAIT状态的原因?

对方关闭socket连接,我方忙于读或写,没有及时关闭连接

检查代码,特别是释放资源的代码 检查配置,特别是处理请求的线程配置

UDP

UDP的特点

面向非连接; 不维护连接状态,支持同时向多个客户端传输相同的消息; 数据包报头只有8个字节,额外开销较小; 吞吐量只受限于数据生成速率,传输速率以及机器性能; 尽量大努力交付,不保证可靠交付,不需要维持复杂的链接状态表; 面向报文,不对应用程序提交的报文信息进行拆分或者合并;

 

 

HTTP

HTTP,全称为 HyperText Transfer Protocol,即为超文本传输协议。是互联网应用最为广泛的一种网络协议,所有的 www 文件都必须遵守这个标准。

 

HTTP 特性:

 

HTTP 可以分为两个部分,即请求和响应

HTTP 请求:

HTTP 定义了在与服务器交互的不同方式,最常用的方法有 4 种,分别是 GET,POST,PUT, DELETE。URL 全称为资源描述符,可以这么认为:一个 URL 地址,对应着一个网络上的资源,而 HTTP 中的 GET,POST,PUT,DELETE 就对应着对这个资源的查询,修改,增添,删除4个操作。

 

HTTP请求结构

HTTP 请求由 3 个部分构成,分别是:状态行,请求头(Request Header),请求正文。

HTTP 响应:

HTTP 响应是服务器在客户端发送 HTTP 请求后经过一些处理而做出的响应,HTTP 响应和 HTTP 请求相似,也是由三个部分构成。分别是:状态行,响应头(Response Header),响应正文。【URL换成了状态码把请求头部变成了响应头部】

HTTP 响应中包含一个状态码,用来表示服务器对客户端响应的结果。

 

HTTP状态码

 

常见的状态码

 

键入URL,经历的流程

DNS解析:找到ip地址

建立TCP连接

发送HTTP请求

处理请求并返回HTTP报文

浏览器收到内容渲染页面

连接结束,四次挥手

 

---当我们在浏览器中输入 http://www.baidu.com/ 访问百度的时候浏览器做了哪些事情。(这里以 Chrome 浏览器为例)

  1. 首先 Chrome 搜索自身的 DNS 缓存。(如果 DNS 缓存中找到百度的 IP 地址,就跳过了接下来查找 IP 地址步骤,直接访问该 IP 地址。)
  2. 搜索操作系统自身的 DNS 缓存。(浏览器没有找到缓存或者缓存已经失效)
  3. 读取硬盘中的 host 文件,里面记录着域名到 IP 地址的映射关系,Mac 电脑中位于 /etc/hosts。(如果前1.2步骤都没有找到)
  4. 浏览器向宽带运营商服务器或者域名服务器发起一个 DNS 解析请求,这里服务器有两种方式解析请求,这在稍后会讲到,之后浏览器获得了百度首页的 IP 地址。
  5. 拿到 IP 地址后,浏览器就向该 IP 所在的服务器建立 TCP 连接(即三次握手)。
  6. 连接建立起来之后,浏览器就可以向服务器发起 HTTP 请求了。(这里比如访问百度首页,就向服务器发起 HTTP 中的 GET 请求)
  7. 服务器接受到这个请求后,根据路径参数,经过后台一些处理之后,把处理后的结果返回给浏览器,如果是百度首页,就可以把完整的 HTML 页面代码返回给浏览器。
  8. 浏览器拿到了百度首页的完整 HTML 页面代码,内核和 JS 引擎就会解析和渲染这个页面,里面的 JS,CSS,图片等静态资源也通过一个个 HTTP 请求进行加载。
  9. 浏览器根据拿到的资源对页面进行渲染,最终把完整的页面呈现给用户。
  10. 如果浏览器没有后续的请求,那么就会跟服务器端发起 TCP 断开(即四次挥手)。

 

会话跟踪常用方法:

Cookie

客户端可以采用两种方式来保存这个 Cookie 对象,一种方式是保存在客户端内存中,称为临时 Cookie,浏览器关闭后这个 Cookie 对象将消失。

另外一种方式是保存在客户机的磁盘上,称为永久 Cookie。以后客户端只要访问该网站,就会将这个 Cookie 再次发送到服务器上,前提是这个 Cookie 在有效期内,这样就实现了对客户的跟踪。

Cookie 是可以被禁止的,当你打开 Chrome,在设置里面关闭 Cookie,那么你将再也无法登录淘宝页面。

Session

每一个用户都有一个不同的 session,各个用户之间是不能共享的,是每个用户所独享的,在 session 中可以存放信息。

Session的实现依赖于Cookie,如果Cookie被禁用,那么session也将失效。

另外实现方式

URL 重写:URL 重写技术就是在 URL 结尾添加一个附加数据以标识该会话,把会话 ID 通过 URL 的信息传递过去,以便在服务器进行识别不同的用户。

隐藏表单域:将会话ID添加到HTML表单元素中提交到服务器,此表单元素并不在客户端显示。

什么时候创建session

当客户端浏览器第一次访问服务器时,服务器为每个浏览器创建不同的HttpSession对象。在服务器端使用request.getSession()方法来获得HttpSession对象,并以此来使用HttpSession接口为我们提供的方法,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。

事实上HttpSession是直到服务器端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 <% @page session=”false”%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。 由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。

session什么时候失效?
  1. 服务器会把长时间没有活动的session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为20分钟。

  2. 调用Session的invalidate方法。

    1. .服务器意外关闭。

 

4..关闭浏览器,结束session 【假象】

--> 当关闭浏览器时怎么就会有session干掉的假象呢?

  由于session是基于Cookie的。浏览器发起请求会携带sessionId到服务器,服务器根据这个id来判读当前访问的是哪个session。

  然而浏览器被关闭后由于浏览器的Cookie文件还未设置MaxAge值,所以在此时浏览器的Cookie是会话级别的,是存在浏览器的内存中,当浏览器被关闭浏览器的内存被释放,临时文件被清除,这时的Cookie也随之销毁,则当前这个请求中被没有之前的那个sessionId值,服务器就当时第一次访问,给浏览器创建一个新的session值并返回一个null;

  但是之前的那个session并没有被干掉,只是浏览器找不到这个sessionId了。这样一来,此时服务器器就存在了两个session了。

解决这个假象的方案:设置setMaxAge()

一个 TCP 连接上面能发多少个 HTTP 请求

http1.0只能一次tcp发一次http

1.1可连续发送,只不过http1.1不能并行发送,必须处理完一个http才能继续,http2则可以并发

https://zhuanlan.zhihu.com/p/61423830

 

GET请求和POST请求的区别

从三个层面解答:

Http报文层面:GET将请求信息放在URL,POST在报文体中

数据库层面:GET符合幂等性(不会改变数据库)和安全性,POST不符合

其他层面:GET可以被缓存、被存储 ,而POST不行

 

JSON

JSON 对象在花括中书写:

对象可以包含多个名称/值对: