HTTP与TCP/IP20连问

  |  
  1. cookie 保存在客户端,未设置存储时间的 cookie,关闭浏览器会话 cookie 就会被删除;设置了存储时间的 cookie 会保存在用户设备的磁盘中直到过期,同时 cookie 在客户端可以伪造,不是十分安全,敏感数据不容易保存。session 保存在服务器端,存在在 IIS 的进程开辟的内存中,而 session 会过多消耗服务器资源,所以尽量少使用 session。
  2. session 是服务器用来跟踪用户的一种手段,每个 session 都有一个唯一标识 sessionID。当服务器端生成一个 session 时就会向客户端发送一个 cookie 保存到客户端。这个 cookie 保存的是 session 的 sessionID,这样才能保证客户端发起请求后,用户能够与服务器端成千上万的 session 进行匹配,同时也保证了不同的页面之间传值的正确性。
  3. 存储数据类型不同:session 能够存储任意的 java 对象,cookie 只能存储 string 类型的对象。
  4. 大于 10k 的数据,不要用到 cookies

TCP 三次握手和四次挥手的流程,断开连接如果只有两次握手,会出现什么。

  1. TCP 三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量从而确认数据发送、接收完毕后何时撤销联系,并建立虚连接。
    第一次握手:建立连接时,客户端发送 syn(synchronize sequence numbers:同步序列编号)包(seq=j)到服务器,并进入 SYN_SEND(请求连接)状态,等待服务器确认。
    第二次握手:服务器接收到 syn 包,必须确认客户的 SYN(ack =j+1)(ack:确认字符,表示发来的数据已确认接收无误),同时自己也发送一个 syn 包(seq=k),即 SYN+Ack 包,此时服务器进入 SYN_RECV(发送 ack)状态。
    第三次握手:客户端搜到服务器发送的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),包发送完毕,客户端与服务器进入 ESTABLISHED(TCP 连接成功)状态,完成三次握手。
    在这里插入图片描述
  2. TCP 四次挥手(连接终止协议,性质为终止协议):
    第一次挥手:TCP 客户端发送一个 FIN+ACK+SEQ,用来传输关闭客户端到服务器的数据。进入 FIN_WAIT1 状态。
    第二次挥手:服务器收到 FIN,被动发送一个 ACK(SEQ+1),进入 CLOSE_WAIT 状态,客户端收到服务器端发送的 ack,进入 FIN_WAIT2 状态。
    第三次挥手:服务器关闭客户端连接,发送一个 FIN+ACK+SEQ 给客户端。进入 LAST_ACK 状态。
    第四次挥手:客户端发送 ACK(ACK=SQE 序号+1)报文确认,客户端今天 TIME_WAIT 状态。服务器收到 ACK 进入 close 状态。
    在这里插入图片描述
  3. 由于 TCP 连接时双向的,因此每个方向都需要单独进行关闭,原则是当一方完成它的数据发送任务后就能发一个 FIN 来终止这个方向的连接。收到一个 FIN 只意味着这一个方向没有数据流动,一个 TCP 连接到一个 FIN 后仍能发送数据。首次执行 FIN 的一方主动关闭,另外一方则执行被动关闭。当只握手两次时,就只会关闭主动发起的一端,另一个仍能发送数据

TIME_WAIT 和 CLOSE_WAIT 的区别

  1. CLOSE_WAIT:等待关闭,是被动关闭连接形成的,也是第二次挥手产生的状态。也就是当对方 close 一个 socket 后发送 FIN 报文给自己,系统会回应一个 ACK 报文给对方,此时进入 close_wait 状态。接着我们需要考虑的事情是查看是否还有数据发送给对方,如果没有就可以 close 这个连接,发送 FIN 给对方,也既关闭连接,所以在 close_wait 状态时,需要查看自己是否需要关闭连接。
  2. TIME_WAIT:是主动关闭连接方式形成的,表示收到了对方的 FIN 报文,并发送 ACK 报文,等待 2MSL(maximum segment lifetime:报文最大生存时间)约 4 分钟时间进入 close 状态。主要是防止最后一个 ACK 丢失,由于 TIME_WAIT 等待时间较长,因此 server 端尽量减少关闭。

为什么需要 TIME_WAIT 状态

假设最终的 ACK 丢失,服务器将重新发送 FIN,客户端必须维护 TCP 状态信息以便可以重发最终的 ACK,否则发送 RST 结果 server 认为发生错误。TCP 实现必须靠的是终止两端的连接(双工关闭),client 必须进入 TIME_WAIT 状态,因为最终的 ACK 可能发送失败。

为什么 TIME_WAIT 状态要保持 2MSL 这么长时间

如果 TIME_WAIT 状态保存时间不足 2MSL,第一个连接可以正常关闭,但是有相同的第二个连接出现,第一个连接重复报文到达,就会干扰第二个连接。TCP 必须防止某个连接的重复报文在连接终止后出现,所以让 TIME_WAIT 状态等待时间大于 2MSL,连接响应方向上的 TCP 报文要么完全响应完毕,要么被丢弃。建立第二次连接时,就不会混淆。

说说你知道的几种 HTTP 响应吗

  1. 200 ok:表示客户端请求成功
  2. 400 Bad Request 语义错误:不能被当前服务器理解。
  3. 401 Unanthorized: 当前请求需要用户验证。
  4. 403 Forbidden: 服务器收到消息,但是拒绝提供服务器。(一般请求 oss 图片资源会出现,需要配置代理)
  5. 404 Not Found: 请求资源不存在。
  6. 408 Request Timeout:请求超时,客户端没有在服务器预备等待的时间内完成发送。
  7. 500 Internal server Error: 服务器发送不可预期的错误。
  8. 503 server Unavailable: 由于临时的服务器维护或过载,服务器当前不能出来请求,此状态是临时的,可恢复。

当你用浏览器打开一个链接的时候,计算机做了哪些工作步骤

  1. 解析域名
  2. 发起 tcp 的 3 次握手
  3. 建立 TCP 请求后发起 HTTP 请求
  4. 服务器响应 HTTP 请求
  5. 浏览器得到 html 代码,进行解析和处理 json 数据,并请求 html 代码中的静态资源(js, css,图片等)
  6. 浏览器对网页进行渲染

TCP/IP 如何保证可靠性,说说 TCP 头的结构

  1. 三次握手
  2. 将数据截断为合理的长度。应用数据被分割成 TCP 认为最为合适发送的数据块
  3. 超时重发
  4. 对于收到的请求,给与确认响应
  5. 如果校验出现数据包错误,则丢弃报文段,不响应
  6. 对失序数据进行重新拍序,发送于客户端
  7. 能够丢弃重复数据
  8. 流量控制。TCP 连接的两端都有缓存大小控制,接收端只允许发送自己缓存剩余大小的数据,有效防止缓存溢出
  9. 拥塞控制。当网络阻塞时,减少数据的发送
    在这里插入图片描述

【TCP 头结构】:

  • 源端口(source port)16位的字段,定义了发送这个保文段的主机中应用程序的端口号。
  • 目的端口(destination port)16位的字段,定义了接收这个报文段的主机中应用程序的端口号。
  • 序列号(sequence number)32位的字段,定义了指派给本报文段第一个数据字节的编号。为了保证连接性,要发送的每一个字节都要编号,序号可以告诉终点,报文段中的第一个字节是这个序列中的哪一个字节。在建立连接时,双方使用各自的随机数生成器生产一个初始序号(inital squence number,ISN),通常两个方向的 ISN 是不同的。
  • 确认号(acknowledgment nimber) 32位字段定义了报文段的接收方期望从对方接收的字节编码。如果报文段的接收方成功地接收了对方发来的编号为 x 的字节,那么它就返回 x+ 1 作为确认号。确认可以和数据捎带一起发送
  • 头部长度(Hlen)这个4个字段指出 TCP 段的头部长度,以 32 位字段来衡量,头部长度并不规定,也可以根据选项字段中设置的参数改变
  • 保留(reserved)这个保留字段占用6位,它可以保留提供将来使用
  • URG紧急数据(urgent data) 这是一条紧急信息
  • ack 确认已收到段
  • PSH请求在缓冲区尚未填满时发生消息,注意 TCP 可以等待缓冲区填满之后在发送段,如果需要立即传送,应用程序必须利用 push 参数来通知协议
  • RET申请重置连接
  • SYN此消息用于建立连接时同步传输数据的计时器
  • FIN改属性申明发送端以及发送别传输数据的最后一个字节
  • 窗口大小(window)16位字段,这个字段定义的是 TCP 的窗口大小,以字节为单位。窗口最大长度是 65535 字节,这个值通常被称为接收窗口(rwnd),并由接收方来决定。这种情况下,发送方必须是服从接收方的指示
  • 校验和(checksum)16为字段包含的是检验和,检验和是差错控制的手动之一
  • 紧急指针(urgent point)该字段占用2字节,与 URG 代码位一起使用并且申明及时使存着缓冲区溢出也必须紧急接收的数据末端,因此,如果有些数据需要不按照顺序被送往目的应用程序,那么发送端的应用程序必须利用紧急数据参数通知 TCP
  • 选项(option) 改字段会变长且可以忽略,他的最大长度为 3 个字节,用于解决一下辅助任务,比如选择最大段长,选项可以位于 TCP 头部的末端,最大长度是 8 的倍数
  • 填充(padding) 该字段长度不固定,这是一个用于补充头部字段使得它的长度为 32 位字节的整数倍的一个伪字段 9

如何理解 HTTP 协议的无状态性

HTTP 协议是无状态的,指的是 http 协议对于事务处理是没有记忆功能,服务器不知道客户端是什么状态。相当于打开一个服务器上的网页与上一次打开这个服务器上的网页之间没有任何联系。HTTP 是一个无状态的面向连接的协议,无状态不代表 HTTP 不能保持 TCP 连接,更不能代表 HTTP 使用的是 UDP 协议(无连接)

简述 Http 请求 get 和 post 的区别以及数据包格式

  1. get 请求可以被缓存,post 不行
  2. get 请求会被浏览器历史记录中保存,post 不行
  3. get 请求可以收藏到书签中,post 不行
  4. get 请求不应在处理敏感数据时候使用,post 可以
  5. get 请求有长度限制,post 没有
  6. post 不限制提交的数据类型,所有 post 可以提交文件到服务器

数据包格式 == TCP 头结构

IE URL 最大限制是 2083 个字节,Path 长度最大是 2048 字节(Get 请求)。
Firefox 65536
Safari 80000 以上
Opera 190000 字节以上
Chrome 8182 字节
Apache Server 8192 字节
IIS 16384 字节
Perl HTTP::Daemon 至少 8000 字节

HTTP 有哪些 method

  • get:获取资源
  • post:表单提交
  • HEAD:获取报头信息,HEAD 方法与 get 方法类似,但是并不会返回响应主体
  • put 和 patch:更新资源,put 对于后台来说是一个完整的资源对象,他包含了对象的所有字段,patch 对于后台来说 patch 方法的参数只包含我们需要修改的资源对象的字段
  • delete:删除资源
  • options:获取目标资源所支持的通信选项,使用 options 方法对服务器发起请求,以检查服务器支持哪些 http 方法

简述 HTTP 请求的报文格式

客户端与服务端通信时传输的内容我们称为报文
客户端发送给服务器的称为请求报文,服务器发送给客户端的称为响应报文
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

HTTP 的长连接是什么意思

长连接是指客户端与服务端建立连接后,不会因完成了一次请求后,它们之间的连接主动关闭。后续的读写操作会继续使,用这个链接。如果一个连接两小时内都没有任何动作,服务器会向客户端发送一个探测报文段、根据客户端主机相应探测 4 个客 户端状态,①、客户端正常时,且服务器可达。此时客户端 TCP 响应正常,服务器将定时器复位。②、客户端已经崩溃,并且关闭或正在重启,客户端不能响应 TCP,服务器将无法收到客户端对探测器的响应。服务器总共发送 10 个这样的探测,每间隔 75 秒。如服务器没有收到任何响应,他就认为客户端已经关闭并终止连接。③ 客户端崩溃,但已重启。服务器将对其保持探测响应,这个响应是一个复位,使得服务器终止这个连接。④ 客户机正常运行,但是服务器,不可达。这种与 ② 类似。
由上可以看出,长连接可以省去较多的 TCP 建立和关闭操作,减少浪费,节约时间。对于频繁请求资源的客户端适合使用,长连接。在长连接的应用场景下,client 端一般不会主动关闭连接,当 client 与 server 之间的连接一直不关闭,随着客,户端连接越来越多,server 会保持过多连接。这时候 server 端需要采取一些策略,如关闭一些长时间没有请求发生的连接,这样可以避免一些恶意连接导致 server 端服务受损;如果条件允许则可以限制每个客户端的最大长连接数,这样可以完全避免恶意的客户端拖垮整体后端服务,例如:数据库的连接用长连接。

HTTPS 的加密方式是什么,讲讲整个加密解密流程

加密方式:
【1】对称密码算法:指加密和解密使用相同的密钥,速度高,可加密内容较大,用来加密会话过程中的消,息,典型算法 DES、AES、RC5、IDEA(分组加密)RC4。
【2】非对称密码算法:又称为公钥加密算法,是指加密和解密使用不同的密钥,加密速度较慢,但能提供更好的身份认证技术,用来加密对称加密的密钥(公开的密钥用于加密,私有的密钥用于解密)典型的法 RSA、 DSA 、DH.
【3】散列算法:将文件内容通过此算法加密变成固定长度的值(散列值),这个过程可以使用密钥也可以不使用。这种散列变化是不可逆的,也就是说不能从散列值编程原文,因此散列变化通道常用语验证原文是否被篡改。典型的算法,MD5、SHA BASE64、CRC 等
注意:SSL 协议在建立链路时 ,SSL 首先对对称加密的密钥进行对公加密,链路建立好之后,SSL 对传输内容使用对称加密.SSL 加密过程:参考 15 问题图 7 双向认证:单向认证作为了解加密过程简化流程
在这里插入图片描述

第三步:客户端使用服务端返回的信息验证服务器的合法性,包括:
1)、证书是否过期
2)、发布服务器证书的 CA 是否可靠。
3)、返回的公钥是否能正确解开返回证书中的数字签名。
4)、服务器证书上的域名是否和服务器实际域名相匹配。

Http 和 Https 的三次握手有什么区别

https 在 http 的基础上加入了 ssl/TSL 协议,ssl 依靠证书来验证服务器的身份,并为服务器域浏览器之间的通信加密。下图为 https 的握手流程
在这里插入图片描述

什么是分块传送

  1. 分块传送是超文本协议 HTTP 中的一种传输机制,允许 HTTP 由网页服务器发送给客户端应用(通常是网页浏览器)的数据可以分成多个部分。分块传送只在 HTTP/1.1 中提供。HTTP 应答消息中发送的数据是整个发送的,Content-Length 消息头字段表示数据的长度。数据的长度很重要,因为客户端需要知道哪里是应答消息的结束,以及后续应答消,息的开始。然而,使用分块传输编码,数据分解成一系列数据块,并以一个或多个块发送,这样服务器可以发送数据而不需要预先知道发送内容的总大小,通常数据块的大小是一致的,但也不总是这种情况。
  2. 对于在发送 HTTP 头部前,无法计算出 Content-Length 的 HTTP 请求及回复(例如 WEB 服务端产生的动态内,容),可以使用分块传输,使得不至于等待所有数据产
    生后,再发送带有 Content-Length 的 HTTP 头部,而是将已经产生的数据一块一块发送出去。
  3. HTTP BODY 数据成连续的块传输,每块数据的最开始处,指明了该数据块的大小,随后则是 CRLF,数据,及结尾,CRLF。可见每块数据
    都是包含在两个 CRLF 之间,最后一块数据则是 OCRLFCRLF,两个 CRLF 之间没有任何数据;数据大小以 16 进制字符串表示(不是二进制)。
  4. 客户端发送请求时,也可以使用分块传输,但是一般客户端发送请求前,不知道服务端是否支持分块传输,所以,客户端可以发送 HTTP 头部,表明使用分块传输,假如服务端不支持,将会回复 411(Length Required)错误,中断请求

http/1.0、http/1.1 和 http2.0 有什么区别

【1】http/1.0 协议默认使用非持久连接,既在非持久连接下,服务器处理完客户端请求后立即断开 TCP 连接,服务器不跟踪每个客户,也不记录过去的请求。
【2】http/1.1 协议默认使用持久连接,既一个 TCP 可以传输多个 WEB 对象。同时也可通过配置支持非持久连接。
【3】http/1.1 增加了 Host 字段,因为目前一台计算机上有多个虚拟主机共享一个 IP 地址,请求和响应消息都应该支持 Host 头信息,且请求消息中没有 Host 头信息会报(400 Bad Request)。此外服务
器应该接受以绝对路径标记的资源请求,而 http/1.0 中每台服务器都绑定一个唯一的 IP,因此,请求消息中的 URL 没有传递主机名(HostName)
【4】增加了新的状态码 100(Continue).客户端事先发送一个只带头域的请求,如果服务因权限等拒绝请求,就回送 401(Unauthorized)或 403;如果服务器接受此请求就回送 100,客户端就可以继续发送带实体的完成请求,状态码的使用,在 request 发送 body 之前,先发送 header 试探一下 server,如果接受 body,再发送 body。可以节省带宽。
【5】 http/1.0 加入了分块编码(Chunked TransferCoding),发送方将消息分割成若干个任意大小的数据块,每个数据块在发送时都会附上块的长度,最后一个零长度的块作为消息的结束标志。这种发送
允许发送方只缓存一个片段,避免缓存整个片段带来的过载。
【6】 http/1.1 在 http/1.0 的基础上加入了一些 Cache 的新特性,当缓存对象 Ag e 超过 Expire 时变为 stale 对象,Cache 不需要直接抛弃 stale 对象,而是与源服务器进行重新激活(revalidation)
【7】http/2.0 支持多路复用技术,同一个连接并发处理多个请求(NIO),http/1.1 可以通过建立多个 TCP 解决。
【8】 http/1.1 不支持 Header 数据的压缩,http/2.0 使用 HPACK 算法对数据压缩,降体积提速度。
【9】 http/2.0 请求服务器,服务器推送数据时会额外推送客户需要的资源,客户下次调用不用请求直接调用。提升速度。

DNS 使用的协议(即使用 TCP 也使用 UDP)

【1】首先了解一下 TCP 与 UDP 传送字节的长度限制:UDP 报文的最大长度为 512 字节,而 TCP 则允许报文长度超过 512 字节。当 DNS 查询超过 512 字节时,协议的 TC 标志出现删除标志,这时使用 TCP 发送通常传统的 UDP 报文一般不会大于 512 字节。
【2】区域传送时使用 TCP,主要有一下两点考虑:辅域名服务器会定时(一般 3 个小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,则会执行一次区域传送, 进行数据同步。区域传送将使用 TCP 而不是 UDP,因为数据同步传送的数据量比一个请求和应答的数据量要多得多。TCP 是一种可靠的连接,保证了数据的准确性。
【3]域名解析时使用 UDP 协议:客户端向 DNS 服务器查询域名,一般返回的内容都不超过 512 字节,用 UDP 传输即可。不用经过 TCP 三次握手,这样 DNS 服务器负载更低,响应更快。虽然从理论上说,客户端也可以指向 DNS 服务器查询的时候使用 TCP,但事实上,很多 DNS 服务器进行配置的时候,仅支持 UDP 查询包。

TCP 粘包和拆包产生的原因

【1】应用程序写入数据的字节大小大于套接字发送缓冲区的大小,
【2】进行 MSS 大小的 TCP 分段。MSS 是最大报文段长度的缩写。MSS 是 TCP 报文段中的数据字段的最大长度,数据字段加上 TCP 首部才等于整个的 TCP 报文段。所以 MSS 并不是 TCP 报文段的最大长度,而是 MSS=TCP 报文段长度-TCP 首部长度,
【3】以太网的 payload 大于 MTU 进行 IP 分片。MTU 指:一种通信协议的某一层上面所能通过的最大数据包大小。如果 IP 层有一个数据包要传,而且数据的长度比链路层的 MTU 大,那么 IP
层就会进行分片,把数据包分成若干片,让每一片都不超过 MTU。注意,IP 分片可以发生在原始发送端主机上,也可以发生在中间路由器上。

【解决办法】:
【1】消息定长。例如 100 字节,
【2】在包尾部增加回车或者空格符等特殊字符进行分割,典型的如 FTP 协议,
【3】将消息分为消息头和消息尾。
【4】其它复杂的协议,如 RTMP 协议等。

WEB 开发中 Forward 和 Redirected 的区别

【1 】间接请求转发(Redirect):实际是两次 HTTP 请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个 URL 发出请求,从而达到转发的目的。一般用于避免用户的非正常访问。例如:用户在没有登录的情况下访问后台资源 ,Servlet 可以将该 HTTP 请求重定向到登录页面,让用户登录以后再访问。
【2】直接请求转发(Forward):客户端和浏览器只发出一次请求,Serlet、HTML、JSP 或其它信息资源,由第二个信息资源响应该请求,在请求对象 request 中,保存的对象对于每个信息资源是共享的。

来源:
腾讯面试 HTTP 与 TCP/IP20 连问,你能答出多少?

文章目录
  1. 1. Session 和 cookie 的区别
  2. 2. TCP 三次握手和四次挥手的流程,断开连接如果只有两次握手,会出现什么。
  3. 3. TIME_WAIT 和 CLOSE_WAIT 的区别
  4. 4. 为什么需要 TIME_WAIT 状态
  5. 5. 为什么 TIME_WAIT 状态要保持 2MSL 这么长时间
  6. 6. 说说你知道的几种 HTTP 响应吗
  7. 7. 当你用浏览器打开一个链接的时候,计算机做了哪些工作步骤
  8. 8. TCP/IP 如何保证可靠性,说说 TCP 头的结构
  9. 9. 如何理解 HTTP 协议的无状态性
  10. 10. 简述 Http 请求 get 和 post 的区别以及数据包格式
  11. 11. HTTP 有哪些 method
  12. 12. 简述 HTTP 请求的报文格式
  13. 13. HTTP 的长连接是什么意思
  14. 14. HTTPS 的加密方式是什么,讲讲整个加密解密流程
  15. 15. Http 和 Https 的三次握手有什么区别
  16. 16. 什么是分块传送
  17. 17. http/1.0、http/1.1 和 http2.0 有什么区别
  18. 18. DNS 使用的协议(即使用 TCP 也使用 UDP)
  19. 19. TCP 粘包和拆包产生的原因
  20. 20. WEB 开发中 Forward 和 Redirected 的区别