TCP、UDP 我不是女神ヾ 2022-08-28 04:57 171阅读 0赞 1.网络模型 网络模型 ![图片][c0116167e6a7b5b00a5abc1a605319ac.png] 应用层协议:http超文本传输协议、smtp邮件协议、FTP文本传输协议、SSH加密安全登录 运输层:TCP、UDP 网络层:IP、ICMP、ARP ![图片][73163e763b3280ad48514a6c110dd782.png] ![图片][e813158729344184ba081e48398267c4.png] 上图中有几个字段需要重点介绍下: * 序号:seq 序号,占 32 位,用来标识从 TCP 源端向目的端发送的字节流,发起方发送数据时对此进行标记。 * 确认序号:ACK 序号,占 32 位,只有 ACK 标志位为1时,确认序号字段才有效,ack=seq+1。 * 标志位:共 6 个,即 URG、ACK、PSH、RST、SYN、FIN 等,具体含义如下: * ACK:确认序号有效。 * FIN:释放一个连接。 * PSH:接收方应该尽快将这个报文交给应用层。 * RST:重置连接。 * SYN:发起一个新连接。 * URG:紧急指针(urgent pointer)有效。 需要注意的是: * 不要将确认序号 ACK 与标志位中的 ACK 搞混了。 * 确认方 ack = 发起方 seq + 1,两端配对。 ![图片][edb3fc8dac6e16bbc7eebf1a96a901d0.png] * 第一次握手:客户端要向服务端发起连接请求,首先客户端随机生成一个起始序列号 ISN(比如是 100),那客户端向服务端发送的报文段包含 SYN 标志位(也就是 SYN = 1),序列号 seq = 100。 * 第二次握手:服务端收到客户端发过来的报文后,发现 SYN = 1,知道这是一个连接请求,于是将客户端的起始序列号 100 存起来,并且随机生成一个服务端的起始序列号(比如是 300)。然后给客户端回复一段报文,回复报文包含 SYN 和 ACK 标志(也就是 SYN = 1,ACK = 1)、序列号 seq = 300、确认号 ack = 101(客户端发过来的序列号 + 1)。 * 第三次握手:客户端收到服务端的回复后发现 ACK = 1并且 ack =101,于是知道服务端已经收到了序列号为 100 的那段报文;同时发现 SYN = 1,知道了服务端同意了这次连接,于是就将服务端的序列号 300 给存下来。然后客户端再回复一段报文给服务端,报文包含 ACK 标志位(ACK = 1)、ack = 301(服务端序列号+1)、seq = 101(第一次握手时发送报文是占据一个序列号的,所以这次 seq 就从 101 开始,需要注意的是不携带数据的 ACK 报文是不占据序列号的,所以后面第一次正式发送数据时 seq 还是 101)。当服务端收到报文后发现 ACK = 1 并且 ack = 301,就知道客户端收到序列号为 300 的报文了,就这样客户端和服务端通过 TCP 建立了连接。 * ![图片][9b0493c0e1823d2467d2cb86a7d7a96a.png] 比如客户端初始化的序列号 ISA = 100,服务端初始化的序列号 ISA = 300。TCP 连接成功后客户端总共发送了 1000 个字节的数据,服务端在客户端发 FIN 报文前总共回复了 2000 个字节的数据。 GET 和 POST 区别: **什么是对称加密与非对称加密?** 对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方。 而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。 由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,非常的慢。 **什么是 HTTP2?** HTTP2 可以提高了网页的性能。 在 HTTP1 中浏览器限制了同一个域名下的请求数量(Chrome 下一般是六个),当在请求很多资源的时候,由于队头阻塞当浏览器达到最大请求数量时,剩余的资源需等待当前的六个请求完成后才能发起请求。 HTTP2 中引入了多路复用的技术,这个技术可以只通过一个 TCP 连接就可以传输所有的请求数据。多路复用可以绕过浏览器限制同一个域名下的请求数量的问题,进而提高了网页的性能。 **Session、Cookie 和 Token 的主要区别** HTTP 协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。 **什么是 Cookie** Cookie 是由 Web 服务器保存在用户浏览器上的小文件(key-value 格式),包含用户相关的信息。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用 response 向客户端浏览器颁发一个 Cookie。客户端浏览器会把 Cookie 保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该 Cookie 一同提交给服务器。服务器检查该 Cookie,以此来辨认用户身份。 **什么是 Session** Session 是依赖 Cookie 实现的。Session 是服务器端对象。 Session 是浏览器和服务器会话过程中,服务器分配的一块储存空间。服务器默认为浏览器在 Cookie 中设置 sessionid,浏览器在向服务器请求过程中传输 Cookie 包含 sessionid ,服务器根据 sessionid 获取出会话中存储的信息,然后确定会话的身份信息。 **Cookie 与 Session 区别** **什么是 Token** Token 的引入:Token 是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token 便应运而生。 Token 的定义:Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 Token 便将此 Token 返回给客户端,以后客户端只需带上这个 Token 前来请求数据即可,无需再次带上用户名和密码。 使用 Token 的目的:Token 的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。 Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。 **Session 与 Token 区别** **Servlet 是线程安全的吗?** Servlet 不是线程安全的,多线程并发的读写会导致数据不同步的问题。 解决的办法是尽量不要定义 name 属性,而是要把 name 变量分别定义在 doGet() 和 doPost() 方法内。虽然使用 synchronized(name)\{\} 语句块可以解决问题,但是会造成线程的等待,不是很科学的办法。 注意:多线程的并发的读写 Servlet 类属性会导致数据不同步。但是如果只是并发地读取属性而不写入,则不存在数据不同步的问题。因此 Servlet 里的只读属性最好定义为 final 类型的。 **Servlet 接口中有哪些方法及 Servlet 生命周期探秘** 在 Java Web 程序中,Servlet 主要负责接收用户请求 HttpServletRequest,在 doGet(),doPost() 中做相应的处理,并将回应 HttpServletResponse 反馈给用户。Servlet 可以设置初始化参数,供 Servlet 内部使用。 Servlet 接口定义了 5 个方法,其中前三个方法与 Servlet 生命周期相关: 生命周期: Web 容器加载 Servlet 并将其实例化后,Servlet 生命周期开始,容器运行其 init() 方法进行 Servlet 的初始化; 请求到达时调用 Servlet 的 service() 方法,service() 方法会根据需要调用与请求对应的 doGet 或 doPost 等方法; 当服务器关闭或项目被卸载时服务器会将 Servlet 实例销毁,此时会调用 Servlet 的 destroy() 方法。 init 方法和 destory 方法只会执行一次,service 方法客户端每次请求 Servlet 都会执行。Servlet 中有时会用到一些需要初始化与销毁的资源,因此可以把初始化资源的代码放入 init 方法中,销毁资源的代码放入 destroy 方法中,这样就不需要每次处理客户端的请求都要初始化与销毁资源。 **如果客户端禁止 Cookie 能实现 Session 还能用吗?** Cookie 与 Session,一般认为是两个独立的东西,Session 采用的是在服务器端保持状态的方案,而 Cookie 采用的是在客户端保持状态的方案。 但为什么禁用 Cookie 就不能得到 Session 呢?因为 Session 是用 Session ID 来确定当前对话所对应的服务器 Session,而 Session ID 是通过 Cookie 来传递的,禁用 Cookie 相当于失去了 Session ID,也就得不到 Session 了。 假定用户关闭 Cookie 的情况下使用 Session,其实现途径有以下几种: * 第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文(当然数据没发完时也可以发送连接释放报文并停止发送数据),释放连接报文包含 FIN 标志位(FIN = 1)、序列号 seq = 1101(100 + 1 + 1000,其中的 1 是建立连接时占的一个序列号)。需要注意的是客户端发出 FIN 报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个序列号。 * 第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文,确认报文包含 ACK 标志位(ACK = 1)、确认号 ack = 1102(客户端 FIN 报文序列号 1101 + 1)、序列号 seq = 2300(300 + 2000)。此时服务端处于关闭等待状态,而不是立马给客户端发 FIN 报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。 * 第三次挥手:服务端将最后数据(比如 50 个字节)发送完毕后就向客户端发出连接释放报文,报文包含 FIN 和 ACK 标志位(FIN = 1,ACK = 1)、确认号和第二次挥手一样 ack = 1102、序列号 seq = 2350(2300 + 50)。 * 第四次挥手:客户端收到服务端发的FIN报文后,向服务端发出确认报文,确认报文包含 ACK 标志位(ACK = 1)、确认号 ack = 2351、序列号 seq = 1102。注意客户端发出确认报文后不是立马释放 TCP 连接,而是要经过 2MSL(最长报文段寿命的 2 倍时长)后才释放 TCP 连接。而服务端一旦收到客户端发出的确认报文就会立马释放 TCP 连接,所以服务端结束 TCP 连接的时间要比客户端早一些。 * **什么是 HTTP,HTTP 与 HTTPS 有什么区别?** HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。 <table> <tbody> <tr> <td>区别</td> <td>HTTP</td> <td>HTTPS</td> </tr> <tr> <td>协议</td> <td>运行在 TCP 之上,明文传输,客户端与服务器端都无法验证对方的身份</td> <td>身披 SSL( Secure Socket Layer )外壳的 HTTP,运行于 SSL 上,SSL 运行于 TCP 之上, 是添加了加密和认证机制的 HTTP。</td> </tr> <tr> <td>端口</td> <td>80</td> <td>443</td> </tr> <tr> <td>资源消耗</td> <td>较少</td> <td>由于加解密处理,会消耗更多的 CPU 和内存资源</td> </tr> <tr> <td>开销</td> <td>无需证书</td> <td>需要证书,而证书一般需要向认证机构购买</td> </tr> <tr> <td>加密机制</td> <td>无</td> <td>共享密钥加密和公开密钥加密并用的混合加密机制</td> </tr> <tr> <td>安全性</td> <td>弱</td> <td>由于加密机制,安全性强</td> </tr> </tbody> </table> **常用 HTTP 状态码** HTTP 状态码表示客户端 HTTP 请求的返回结果、标识服务器处理是否正常、表明请求出现的错误等。 状态码的类别: <table> <tbody> <tr> <td>类别</td> <td>原因短语</td> </tr> <tr> <td>1XX</td> <td>Informational(信息性状态码) 接受的请求正在处理</td> </tr> <tr> <td>2XX</td> <td>Success(成功状态码) 请求正常处理完毕</td> </tr> <tr> <td>3XX</td> <td>Redirection(重定向状态码) 需要进行附加操作以完成请求</td> </tr> <tr> <td>4XX</td> <td>Client Error(客户端错误状态码) 服务器无法处理请求</td> </tr> <tr> <td>5XX</td> <td>Server Error(服务器错误状态码) 服务器处理请求出错</td> </tr> </tbody> </table> 常用 HTTP 状态码: <table> <tbody> <tr> <td>2XX</td> <td>成功(这系列表明请求被正常处理了)</td> </tr> <tr> <td>200</td> <td>OK,表示从客户端发来的请求在服务器端被正确处理</td> </tr> <tr> <td>204</td> <td>No content,表示请求成功,但响应报文不含实体的主体部分</td> </tr> <tr> <td>206</td> <td>Partial Content,进行范围请求成功</td> </tr> </tbody> </table> <table> <tbody> <tr> <td>3XX</td> <td>重定向(表明浏览器要执行特殊处理)</td> </tr> <tr> <td>301</td> <td>moved permanently,永久性重定向,表示资源已被分配了新的 URL</td> </tr> <tr> <td>302</td> <td>found,临时性重定向,表示资源临时被分配了新的 URL</td> </tr> <tr> <td>303</td> <td>see other,表示资源存在着另一个 URL,应使用 GET 方法获取资源(对于301/302/303响应,几乎所有浏览器都会删除报文主体并自动用GET重新请求)</td> </tr> <tr> <td>304</td> <td>not modified,表示服务器允许访问资源,但请求未满足条件的情况(与重定向无关)</td> </tr> <tr> <td>307</td> <td>temporary redirect,临时重定向,和302含义类似,但是期望客户端保持请求方法不变向新的地址发出请求</td> </tr> </tbody> </table> <table> <tbody> <tr> <td>4XX</td> <td>客户端错误</td> </tr> <tr> <td>400</td> <td>bad request,请求报文存在语法错误</td> </tr> <tr> <td>401</td> <td>unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息</td> </tr> <tr> <td>403</td> <td>forbidden,表示对请求资源的访问被服务器拒绝,可在实体主体部分返回原因描述</td> </tr> <tr> <td>404</td> <td>not found,表示在服务器上没有找到请求的资源</td> </tr> </tbody> </table> <table> <tbody> <tr> <td>5XX</td> <td>服务器错误</td> </tr> <tr> <td>500</td> <td>internal sever error,表示服务器端在执行请求时发生了错误</td> </tr> <tr> <td>501</td> <td>Not Implemented,表示服务器不支持当前请求所需要的某个功能</td> </tr> <tr> <td>503</td> <td>service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求</td> </tr> </tbody> </table> **GET 和 POST 区别** 说道 GET 和 POST,就不得不提 HTTP 协议,因为浏览器和服务器的交互是通过 HTTP 协议执行的,而 GET 和 POST 也是 HTTP 协议中的两种方法。 HTTP 全称为 Hyper Text Transfer Protocol,中文翻译为超文本传输协议,目的是保证浏览器与服务器之间的通信。HTTP的工作方式是客户端与服务器之间的请求-应答协议。 HTTP 协议中定义了浏览器和服务器进行交互的不同方法,基本方法有 4 种,分别是 GET,POST,PUT,DELETE。这四种方法可以理解为,对服务器资源的查,改,增,删。 * GET:从服务器上获取数据,也就是所谓的查,仅仅是获取服务器资源,不进行修改。 * POST:向服务器提交数据,这就涉及到了数据的更新,也就是更改服务器的数据。 * PUT:英文含义是放置,也就是向服务器新添加数据,就是所谓的增。 * DELETE:从字面意思也能看出,这种方式就是删除服务器数据的过程。 * Get 是不安全的,因为在传输过程,数据被放在请求的 URL 中;Post 的所有操作对用户来说都是不可见的。但是这种做法也不时绝对的,大部分人的做法也是按照上面的说法来的,但是也可以在 get 请求加上 request body,给 post 请求带上 URL 参数。 * Get 请求提交的 url 中的数据最多只能是 2048 字节,这个限制是浏览器或者服务器给添加的,http 协议并没有对 url 长度进行限制,目的是为了保证服务器和浏览器能够正常运行,防止有人恶意发送请求。Post 请求则没有大小限制。 * Get 限制 Form 表单的数据集的值必须为 ASCII 字符;而 Post 支持整个 ISO10646字符集。 * Get 执行效率却比 Post 方法好。Get 是 form 提交的默认方法。 * GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包。 * 对于 GET 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据);而对于 POST,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)。 * 存储位置与安全性:Cookie 数据存放在客户端上,安全性较差,Session 数据放在服务器上,安全性相对更高; * 存储空间:单个 Cookie 保存的数据不能超过4 K,很多浏览器都限制一个站点最多保存 20 个 Cookie,Session 无此限制 * 占用服务器资源:Session 一定时间内保存在服务器上,当访问增多,占用服务器性能,考虑到服务器性能方面,应当使用 Cookie。 * Session 机制存在服务器压力增大,CSRF 跨站伪造请求攻击,扩展性不强等问题; * Session 存储在服务器端,Token 存储在客户端 * Token 提供认证和授权功能,作为身份认证,Token 安全性比 Session 好; * Session这种会话存储方式方式只适用于客户端代码和服务端代码运行在同一台服务器上,Token 适用于项目级的前后端分离(前后端代码运行在不同的服务器下) * void init(ServletConfig config) throws ServletException * void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException * void destory() * java.lang.String getServletInfo() * ServletConfig getServletConfig() * 手动通过 URL 传值、隐藏表单传递 Session ID。 * 用文件、数据库等形式保存 Session ID,在跨页过程中手动调用。 [c0116167e6a7b5b00a5abc1a605319ac.png]: /images/20220828/c5ebe36b061f45d6bdefc190421ccbd3.png [73163e763b3280ad48514a6c110dd782.png]: /images/20220828/71b8758345d442c2863102bdf7d025e6.png [e813158729344184ba081e48398267c4.png]: /images/20220828/49993e135f5043f58c838d20dd6a6221.png [edb3fc8dac6e16bbc7eebf1a96a901d0.png]: /images/20220828/11018518a52d4ec58576856145124f32.png [9b0493c0e1823d2467d2cb86a7d7a96a.png]: /images/20220828/c062dbd2fbf14375a6e425495c99a40e.png
相关 图解TCPIP---第六章---传输层TCPUDP 哈哈哈哈哈哈哈哈 `TCPIP识别一个进行通信的应用需要5大要素` 源IP地址 目标IP地址 源端口 目标端口 协议号 ------ ╰半橙微兮°/ 2023年07月04日 08:47/ 0 赞/ 38 阅读
还没有评论,来说两句吧...