HTTP
- HTTP 请求报文
- HTTP 请求报文由请求行、请求头、空行 和 请求体组成
- 请求行:包括请求方法,URL,HTTP版本。请求头:客户端的属性信息。主要有cookie、host、connection、Accept;请求体:用户请求数据。
- HTTP响应报文
- HTTP响应报文由状态线、响应头、空行和响应体组成
- 状态行:HTTP版本、状态码和状态描述。 响应头:服务器属性信息,Set-Cookie、connection、Content-Length; 响应体:服务器返回到客户端。
- IP --- 网络层TCP/UDP --- 传输层HTTP、DNS、SMTP、FTP -- 应用层协议
- 请求头:
- Accept: 告诉服务器可接受的文件类型
- Host:服务器想要访问的服务器域名或IP
- : 管理连接的耐久性,Keep-Alive:长连接,close:短连接
- Accept-Encoding :告诉服务器浏览器支持什么编码
- Accept-Language :支持的语言 ;
- User-Agent:浏览器的类型
- 响应头:
- Content-Length:响应体的长度
- Server:服务器信息
- Content-Type:内容类型,text/html,xml等
- http对发送的请求或响应不持久,多个请求是独立的。
- 在不修改数据的情况下,向服务器获取指定资源
- 向服务器提交数据
- 与POST类似地,将数据发送到服务器,但具有功率等特性,通常用于更新
- 补充:HTTP方法的同一请求被执行一次,连续执行多次的;
- 用于删除服务器指定的资源
- ① GET而且post提交数据
- ② GET请求参数通过URL传递,POST请求体中的参数。③ GET请求会把 header 和 data 一起发送;和 post 会先发 header 收到 100 响应状态码后再发送 data④ GET浏览器将提出请求主动缓存,而POST不,除非手动设置。(订单的例子)
- ⑤ GET 是幂等的,post 不是幂等的。
- ⑥ GET发送的报纸长度有限,最大约2k,POST报文无此限制;
- 默认使用短连接。浏览器和服务器每次进行一次HTTP操作时,建立连接,任务结束时中断连接。
- ,默认使用长连接。使用长连接、客户端和服务器HTTP首部的
Connection字段
都要设置为keep-alive,支持长连接。 - HTTP长连接,指的是复用TCP连接。多个HTTP同一个请求可以重用TCP连接,可以节省TCP建立和断开连接的消耗。
- ① 支持长连接:避免每次客户端和服务器都要求建立和释放TCP连接;
- ② 引入了更多的缓存控制策略
- ③ 增加Host字段
- ④ 支持断点传输等
- ①采用二进制格式传输数据,分析效率更高HTTP1.1 传输基于文本格式的数据。
- ② 多路复用:在一个TCP在连接中,多个请求或响应可以平行传输而不被阻塞;
- ③ 头部压缩: 使用特定算法压缩头帧,有效减少头部信息的大小,双方各自通信header fields表,避免重复header的传输。
- ④ 服务推送:HTTP2.0允许服务器将资源推送到客户端。
- 放弃了tcp协议改用了 ,本协议以传输层为基础UDP协议。
- QUIC基本特点:
- 连接建立时间短;
- 改善拥塞控制;
- 一条 QUIC 连接上的多个请求之间没有依赖性;
- 采用向前纠错方案,减少包的重传;
- ① HTTP信息传输简单但不安全;HTTPS它是安全的ssl加密传输协议,但复杂。
- ② HTTP和HTTPS使用的端口不同,HTTP端口是80,HTTPS是443。
- ③https需要认证证书 ,而http不需要
- :
- 窃听:可能被第三方窃听 伪装:无法确认通信双方的身份信息 篡改:报纸也可能被篡改:
- HTTPS解决方案:
- 加密:对称密钥和非对称密钥
- 认证:引进CA
- 防篡改:传输时计算报文 md5 摘要一起传过去
- ① 客户端向服务端发送支持的加密算法和随机数1;
- ② 将选定的加密算法返回客户端,包括服务器公钥证书和随机数2;
- ③ 客户端验证服务器证书,提取服务器公钥,生成发送给服务器的前主密钥;
- ④ 客户端和服务器根据前主密钥和两个随机数计算当前会话的主密钥;
- ⑤ 开始传输数据,使用相同的对称密钥加解密。
100 Continue
到目前为止,所有内容都是可行的,客户应该继续要求。200 OK
请求成功。301 Moved Permanently
资源已被要求永久浏览器将自动定位到新位置URI。未来任何新的请求都将使用新的请求URI代替。302 Found
临时重定向。资源只是。临时被移动,原始请求应在未来继续使用URI。404 Not Found
请求失败,请求资源未在服务器上找到。500 Internal Server Error
服务器遇到了不知处理。502 Bad Gateway
服务器充当网关,从远端服务器接收一个无效(错误)的请求。504 Gateway TimeOut
充当网关服务器,未及时从远端服务器获取请求。- 长连接多用于频繁通信,数据库连接采用长连接。
- 一个客户端口只有2个^16,理论上只有65536个长连接(0~65535)
- ① 转发是服务器端的跳转,重定向是客户端的跳转
- ② 转发请求一次,请求域中的数据不会丢失,重定向请求至少两次,数据不共享。
- ③ 转发地址栏不会改变,重定向地址栏会改变。
- ④ 转发只能跳转到本网站的资源,重定向可以跳转到任何地方URL。
- Cookie 和 Session都是用来跟用户身份的会话方式。
- ① cookie 在客户端,不安全,session 在服务器端,更安全;
- ② cookie 可设置为长时间保持,比如默认登录功能,Session 存活时间较短,客户端关闭或者 Session 超时都会失效;
- ③ 存储大小不同, 单个 Cookie 保存的数据不能超过 4K;对于 Session 来说存储没有上限;
-
- 浏览器向服务器发出请求时,服务器先会检查这个请求是否已经包含了一个sessionid;
- 如果有,服务器就按照sessionid把这个session检索出来使用;
- 如果客户端请求不包含session id,则服务器为此客户端创建一个session,并生成一个sessionid存放到cookie中,然后响应给客户端;
- 之后,浏览器端每次请求时,都会带着这个sessionid。
禁用cookie后,还能用session吗?把 sessionID 直接写到 URL 里传上去就可以了。
- 分布式Session的一致性问题:同一个客户端的不同请求可能会分配到不同的服务器上,如果不同的web服务器如果使用不同的Session,那么之前的状态就会丢失;
- session绑定:对客户端和服务器进行绑定(基于nginx的ip-hash策略),同一个客户端无论发送多少次请求,都被同一个服务器处理(负载不均衡);
- session同步 :任何一个服务器上的session发生改变(增删改),都会广播给所有其它服务器(数据量大时,服务器压力大);
- session持久化到MySQL数据库,拿出一个数据库,专门用来存储session信息,数据库压力大;
- session持久化到redis中;
- ① 轮询:把请求按照时间顺序依次分配到不同的服务上;
- ② 加权:weight值越大的服务器,被分配到请求的概率越大;
- ③ ip_hash:将客户端的ip进行hash,再通过hash值选择服务器;
- ④ url_hash:对请求url进行hash,再通过hash值选择服务器;
- ⑤ 响应时间:按服务器的响应时间来分配请求,响应时间短的优先分配。
-
-
DNS
- 根域名:一般被省略,如果要表示根域,应该像
www.baidu.com.
在域名的最后再加上一个句点 - 顶级域名(一级域名):由根域名管理,比如
.com
、.org
、.cn
- 权威域名:
baidu
- www是主机名
- 二级域名:是在一级域名前加一级,示例:
baidu.com
-
- ① 浏览器搜索自己的DNS缓存② 如果没有命中,则读取操作系统的hosts文件看是否存在对应的映射关系③ 如果没有,则查找本地DNS服务器,查找成功则返回结果;
- ④否则,若本地DNS服务器开启转发模式,则向上一级请求,若上一级也不能解析就找上上一级依次类推,最终把解析返回给本地DNS,本地DNS返回给主机
- ⑤若没有开启转发模式,就把请求发至根DNS,根DNS服务器会返回对应的顶级DNS的IP,然后本地DNS服务器会向顶级DNS服务器发出查询请求,这样一直查下去,即依次向根域名服务器、顶级域名服务器、权限域名服务器发起查询请求,最终本地DNS服务器得到ip
- ⑥ 本地域名服务器将得到的IP地址返回给操作系统,操作系统返回给浏览器,同时进行缓存
- 主要使用UDP,当报文长度超过512字节时使用TCP
-
-
-
网络安全
- 通信双方使用相同的密钥进行加密、解密。加密速度快,但是不安全。常见的对称加密有AES和DES算法。
- 它需要生成两个密钥,公钥和私钥。公钥是对外公开的,而私钥是自己保管的。公钥负责加密,私钥负责解密;或者私钥负责加密,公钥负责解密。安全性更高,但是计算量大,加密和解密都很慢。常见的非对称算法有RSA和DSA。
-
- SYN洪泛攻击(发生在传输层),利用TCP协议的特点,攻击者一直发送SYN包(三次握手的第一个数据包),而不进行再确认,那这个TCP连接在服务端就处于挂起状态,服务器收不到再确认的话,会重复发送ACK给攻击者。这样浪费服务器的大量资源。
- 降低SYN timeout时间,使得主机尽快释放半连接的占用;
- 设置SYN cookie,如果短时间内收到了某个IP的重复SYN请求,就认为受到了攻击,合理地采用防火墙进行拦截
-
-
TCP/IP/UDP
-
- :为应用程序提供交互服务。协议:DNS、HTTP、SMTP等。
- :数据格式转换、加密解密以及压缩解压缩。协议:JPEG、ASCll等
- 建立、管理、终止会话。协议:ASP;
- :负责两台主机进程间的通信,即端到端的通信。协议:TCP、UDP。
- :转发,路由选择。协议:IP、ICMP、ARP、RARP。
- :将网络层的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。协议:PPP、HDLC.
- :在物理媒介上实现比特流的透明传输。协议:802.3、Rj45.
-
- 确认通信双方的发送与接收能力是否正常
-
- 假设客户端是发送端。开始时,客户端和服务端都是
Closed
状态,发送连接请求前,服务端会进入LISTEN
状态。
- 客户端向服务端发送建立连接请求,发送的字段中标志位
SYN=1
,序列号seq=x
。第一次握手前客户端的状态为CLOSE
,第一次握手后客户端的状态为SYN-SENT
(同步已发送)。 - 服务端在收到客户端发来的报文后,会为TCP连接分配缓存和变量,然后返回确认报文,其中标志位
SYN=1
,ACK=1
,序列号seq=y
,确认号ack=x+1
。第二次握手后服务端的状态为SYN-RCVD
(同步收到)。(其中SYN=1表示要和客户端建立一个连接,ACK=1表示确认序号有效) - 客户端在收到服务端的报文后,会为TCP连接分配缓存和变量,然后再向服务端发送报文,其中标志位
ACK=1
,序列号seq=x+1
,确认号ack=y+1
。第三次握手前客户端的状态为SYN-SENT
,第三次握手后客户端和服务端的状态都为ESTABLISHED
。此时连接建立完成。 -
- 第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常
- 第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;
- 第三次握手:Server 额外确认了:自己发送正常,对方接收正常
- 确保通信双方的收发能力正常;
- 此外可以防止已失效的连接请求又传送到服务端,因而产生错误;
- 若建立连接只需两次握手,服务端在收到连接请求后就进入
ESTABLISHED
状态。如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,然后连接成功,双方开始通信,通信结束后释放连接。如果那个失效的连接请求此时抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED
状态,等待客户端发送数据。但此时的客户端早已进入CLOSED
状态,服务端将会一直等待下去,这样浪费服务端连接资源。
- 浪费
-
- 第一次客户端发的 SYN 丢了:客户端迟迟接不到响应,超时重传。 第二次服务端发的 SYN 和 ACK 丢了:客户端迟迟接不到响应,超时重传 第三次客户端发的 ACK 丢了:服务端超时重传
- (默认重发次,之后自动关闭连接)
-
- 服务器每收到一次客户端的请求后都会重新复位一个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送个探测报文仍然没反应,服务器就就关闭连接。
-
- 没有,第一次、第二次都没有数据,第三次可以携带数据。
-
- 以客户端发起关闭连接为例,挥手前客户端和服务端均处于
ESTABLISHED
状态。
- 客户端向服务端发出连接释放请求,即FIN报文,然后客户端进入
FIN-WAIT-1
(终止等待1)状态。 - 服务端收到连接释放报文后,发出ACK应答报文,服务端进入
CLOSE-WAIT
(关闭等待)状态。客户端收到服务端的ACK报文后,进入FIN-WAIT-2
(终止等待2)状态。 - 服务端发送完数据后,会发送FIN+ACK报文,服务端进入
LAST-ACK
(最后确认)状态。 - 客户端收到服务端的连接释放报文后,发出ACK确认报文,客户端进入
TIME-WAIT
(时间等待)状态。此时TCP未释放掉,需要经过2MSL(最大报文段生存时间)后,客户端才进入CLOSED
状态。服务端在收到客户端的ACK确认报文后直接进入CLOSED
状态。 -
- 当服务端端收到客户端的连接释放报文时,服务端可能还有数据要发送给客户端,TCP要询问应用程序,为了不让客户端干等,所以只能先回复一个ACK报文。只有等到服务端所有的报文都发送完了,才能发送连接释放报文,之后两边才会真正的断开连接。
-
- 如果ACK报文丢失,服务端就会超时重传FIN报文,最坏情况下:去时ACK报文的最大存活时间 + 来时FIN报文的最大存活时间。即如果服务端没有收到客户端的最后ACK报文,那么客户端会在2MSL内收到服务端的重传报文,然后客户端进行重传。若A发送完ACK报文段后立即释放连接,则无法收到B重传的连接释放报文段,所以不会再发送一次确认报文段,B就无法正常进入到CLOSED状态。
- 客户端等待2MSL,可以使当前连接所产生的所有报文都从网络中消失,使下一个新的连接中不会出现旧的连接请求报文。
-
- ① TCP面向连接;UDP是无连接的
- ② TCP提供可靠的服务;UDP尽最大努力交付,不保证可靠交付
- ③ TCP面向字节流;UDP是面向报文的
- ④ TCP有拥塞控制;UDP没有拥塞控制,网络拥塞不会使源主机的发送速率降低
- ⑤ 一个TCP连接只能是点到点的; UDP一对多
-
- TCP:电子邮件、文件传输,准确性要求高的场景
- UDP:在线视频、语音电话,实时性要求高,偶尔的卡顿也可以接受;
-
- 基础是滑动窗口协议,配合着一些控制机制使得整个传输过程可靠。
- 滑动窗口协议:
- 首先在发送方和接收方都维护一个滑动窗口,发送方的窗口大小其实是由接收方的响应报文里的一个字段控制的。
- 发送方:窗内都允许被发送,窗内最前面的字节如果已发送并且被确认,窗口向后滑动,直到第一个未被确认状态的字节。
- 接收方:窗内都允许被接收,窗内最前的字节如果已接收,向后滑动,直到第一个不是已接收的状态的字节。最重要的是,接收方仅对最后一个按序到达的字节进行确认!
-
- :
- TCP会把应用层的数据拆分成适合传输的一个个块儿。
- 发送端对发送的包进行编号,接收端对收到的包进行排序。
- :
- 超时重传:当发送方发送一个包时,启动一个定时器,等待接收方确认这个包,如果时间到了未收到确认,则重发。
- :为了控制发送方发送速率,保证接收方来得及接收。接收端返回的确认报文中的窗口字段可以控制发送窗口大小,从而影响发送方的速率。将窗口字段设置为 0,则不能发送数据。
- (四个算法):当网络拥塞时,会丢包,此时发送方会不断尝试重传,从而导致拥塞程度更高。因此当出现拥塞时,应当限制发送方的发送速率。//和流量控制很像但目的不同。流量控制更多的是一个端到端的控制,要做的是抑制发送端发送数据的速率,主要是为了控制接收方来得及接。而拥塞控制是为了宏观上降低网络的拥塞程度。
- :
- 校验和:如果发现首部数据的校验和有误,那么就丢弃该数据包,且不发送确认消息。
- 丢弃重复:如果收到重复的数据包,直接丢弃。
- 补充:
- 拥塞控制四个算法:慢开始,拥塞避免;快重传,快恢复;
- 慢开始:每接受一个ACK确认,拥塞窗口就增加一倍,即传输的数据量增加一倍;
- 拥塞避免:当拥塞窗口超过阈值时,拥塞窗口就加一;
- 快重传:如果发送方收到重复的三个确认,则会立即重传确认所期待的下一个报文
- 快恢复:在快重传的情况下,将cwnd设置为阈值的一半进行数据传输;
-
- 要从 UDP 的缺点来考虑: UDP 只管发,不管收,收到的包可能不完整、乱序到达或者丢失。从以下几个方面来考虑:
- ① 保证数据包的完整性 –> 加上验证字段② 发送的包有可能是乱序到达的 –> 每个包加上一个序号③ 可能会发生丢包 –> 需要确认和重传机制
-
-
-
- 粘包:
- 由于TCP是面向字节流的,字节流没有边界,可能会出现多个数据的流连到一起的情况。比如使用了Nagle算法,将多个较小的数据合并到一个包中发送;
- 拆包:
- TCP的字节流没有长度限制,但是网络层的IP数据包有长度限制,如果字节流过长,网络层会把这个字节流拆分到不同的包中;
- 解决方案:
- 通过分隔符表示数据的结束;
- 在数据报头部标明数据报的长度;
-
- 文件上传(单向传输)
-
-
-
-
-
-
综合
- ① DNS解析域名,得到服务器 IP。
- ② 进行ARP解析,根据IP获取MAC地址。
- ③ 经过三次握手,建立 TCP 连接。
- ④ 建立 TCP 连接后,浏览器向服务器发起HTTP或HTTPs请求。
- ⑤ 服务器处理请求,SpringMVC处理,返回渲染页面
- ⑥ 四次挥手断开TCP连接
-
-
- URI:统一资源标识符,是一种抽象概念,不管用什么方法,能定位到指定的资源就行;
- URL:统一资源定位符,表示资源的路径,属于URI的子集,可以看成是URI的实现。
-
- :是网络的出口,通过网关能到达其它的网络;(当前网络中能到达尽量多其他网络的设备)
-
-
- 根据IP地址获取目标的MAC地址;
- 假设有A、B主机,A想要获取B的MAC地址
- ARP请求:A先检查ARP缓存表(IP与MAC地址的映射表),若没有,则通过发送广播报文来获取
- ARP应答:其它主机收到广播报文后,会首先进行ARP缓存,然后检查目的IP是不是自己,不是则丢弃报文,如果目的IP是自己,则向A单播自己的ARP应答报文;
-
-
-