计算机网络
OSI五层网络协议体系结构
物理层
- 在物理层上所传送的数据单位是比特。物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。
网络层
- 在计算机网络中进行通行的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多的通信子网。网络层的任务就是选择合适的网间路由和交换节点,确保数据能够及时传送。在发送数据时,网络层把运输层产生的报文段或者用户数据报封装程分组和包进行传送。在TCP/IP体系结构中,由于网络层使用IP协议,因此分组也叫IP数据报,简称数据报
应用层
- 应用层的任务是通过应用进程间的交互来完成特定的网络应用。应用层协议定义的是应用进程间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,比如域名系统DNS,支持万维网应用的HTTp协议,支持电子邮件的SMTP协议等等。我们把应用层交互的数据单元称为保文
运输层
- 运输层的主要任务就是负责向两台主机进程之前的通信提供通用的数据传输服务。应用进程利用该服务传送应用层保文。“通用的是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个传输服务。
由于一台主机可以同时运行多个线程,因此运输层有复用和分用的功能。所谓的复用就是指多个应用层进程可以同时使用下层运输层的服务,分用和复用相反,是运输层把收到的信息分别交付到上面应用层中的相应进程。
数据链路层
- 通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。在两个相邻节点之间传送数据时,数据链路层将网络层交下来的IP数据报组成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息,比如说同步信息,地址信息,差错控制等。
在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个结束。这样,数据链路层在收到一个帧后,就可以从中提出数据部分,上交给网络层。控制信息还使得接收端能够检测到所收到的帧有有无差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。
OSI五层网络协议
应用层
- 超文本传输协议:HTTP
- 文本传输协议:FTP
- 简单邮件传输协议:SMTP
- 域名系统:DNS
- 完全外壳协议:SSH
- 远程登陆协议:TELNET
传输层
- 传输控制协议:TCP
- 用户数据报文协议:UDP
网络层
网际协议:IP
ARP:地址转换协议
- 网络层的ARP协议完成了IP地址与物理地址的映射。首先,每台主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。当源主机需要将一个数据包要发送到目的主机时,会首先检查ARP列表中是否存在该IP地址对应的MAC地址;如果有,就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。
- 此ARP请求数据包里面包括源主机的IP地址、硬件地址、以及目的主机的IP地址。网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP地址是否和自己的IP地址一致。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果该ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个ARP响应的数据包,告诉对方自己是它需要查找的MAC地址;源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
RARP:反向地址转换协议
ICMP:Internet控制报文协议
IGMP:Internet组协议管理
RIP:路由信息协议
OSPF:分布式链路状态协议
BGP:边界网关协议
数据链路层
自动重传请求协议:ARQ
- 停止等待协议中超时重传是指只要超过一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送过的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重传时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为自动重传请求 ARQ
停止等待协议:CSMA/CD
点对点协议:PPP
物理层
- 中继器
- 集线器
- 网线
- HUB
IP地址分类
IP 地址是指互联网协议地址,是 IP 协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。IP 地址编址方案将 IP 地址空间划分为 A、B、C、D、E 五类,其中 A、B、C 是基本类,D、E 类作为多播和保留使用,为特殊地址。每个 IP 地址包括两个标识码(ID),即网络 ID 和主机 ID。同一个物理网络上的所有主机都使用同一个网络 ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机 ID 与其对应。
A-E类地址分类
- A 类地址:以 0 开头,第一个字节范围:0~127
- B 类地址:以 10 开头,第一个字节范围:128~191
- C 类地址:以 110 开头,第一个字节范围:192~223
- D 类地址:以 1110 开头,第一个字节范围为 224~239
- E 类地址:以 1111 开头,保留地址
TCP
特征
- tcp提供可靠交付的服务。通过tcp连接传送的数据,无差错,不丢失,不重复,并且按序到达。
- 每条tcp连接只能有两个端点,每条tcp连接只能是点对点的
- tcp面向连接
- tcp提供全双工通信。tcp允许通信双方的应用进程在任何时候都能发送数据。tcp连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据
- 面向字节流。tcp中的流指的是流入进程或者从进程流出的字节序列。面向字节流的含义是:虽然应用程序和tcp的交互是一次一个数据块,但tcp把应用程序交下来但数据仅仅是看成是一连串但无结构但字节流
三次握手
- 第一次客户端向服务端发送报文数据
- 第二次服务端接收报文后向客户端发送确认报文以及响应报文,确认客户端的发送功能以及服务器的接收能力
- 第三次客户端发送确认报文以及响应报文,确认服务端的发送能力以及客户端的接收能力
四次挥手
- 客户端给服务端发送消息告诉服务端我要关了
- 服务端告诉客户端我知道了,然后进入关闭等待状态,此时TCP连接处于半关闭状胎,但是服务端可能还有数据要发送数据
- 第三次服务端告诉客户端我没数据了我准备关了
- 客户端告诉服务端你可以关了,然后服务端关了连接
- 等待2MSL后客户端关了
等待2MSL
- 确认报文ACK可能丢失
- 服务端在2MSL的时间内没有收到确认报文会重新发送
- 两端进入closed状态
保活计时器
- 场景:客户主动建立tcp连接,后来客户端主机发生故障,服务器就不能收到客户端发来的数据
- 方案:服务器每次收到客户数据,就重新设置保活器,时间的设置通常是两小时。如果两个小时都没有收到客户端发来的数据,服务端就发送一个探测报文段,以后则每隔75S发送一次,如果连续发送10个探测报文客户端仍然没有响应,服务端则认为客户端出了故障,接着关闭连接
如何保证可靠传输
数据包校验
- 目的是检测数据在传输过程中的任何变化,若检验出包有错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据
丢失重复数据
- 对于重复数据,能够丢弃重复数据
对失序数据包重新排序
- 既然TCP报文段作为IP数据来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达可能也会失序。TCP将对失序数据进行重新排序,然后交给应用层
应答机制
- 当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒
超时重发
- 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段
流量控制
- TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这个可以防止较快主机导致较慢主机的缓冲区溢出,这就是流量控制。
TCP使用的流量控制协议是可变大小的滑动窗口协议。
UDP
udp是无连接的
udp尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态
udp是面向报文的
udp没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时的应用很有用,如直播,实时视频会议等)
udp支持一对一、一对多、多对一和多对多的交互通信
udp的首部开销小,只有八个字节,比tcp的20个字节的首部要短
TCP 和 UDP的区别
TCP提供面向连接的服务。在传送数据之前必须建立连接,数据传送结束后释放连接。
TCP不提供广播或者多播服务
由于TCP要提供可靠的面向连接的运输服务, 可靠性体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完之后,还会断开连接用来节约系统资源),这个难以避免的增加来许多开销,如确认,流量控制,计时器以及连接管理。这个不仅使协议数据单元的首部增大很多,而且还要占据许多处理机资源。
UDP在传送数据之前不需要建立连接,远程主机在收到UDP保文后,不需要给出任何确认。虽然UDP不需要提供可靠交付,但在某些情况下UDP确实是一种最有效但工作方式,一般用于即时通信,比如qq语音,qq视频,直播等。
滑动窗口
描述
- TCP利用滑动窗口实现流量控制的机制,滑动窗口是一种流量控制技术
背景
- 早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞情况,同时发送数据,导致中间节点阻塞调包,谁也发送不了数据,所有就有来滑动窗口的机制来解决这个问题
方案
- TCP中采用的是滑动窗口来进行一个传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为0的时候,发送方一把不能再发送数据报,但是有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个字节的数据报来通知接收方重新声明它希望接收的下一个字节以及发送方的滑动窗口大小。
流量控制
- TCP利用滑动窗口来实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方发送的确认报文中的窗口字段可以用来控制发送方的窗口大小,从而影响发送方的发送速率。将窗口字段设置为0,则发送方不能发送数据
拥塞控制
描述
- 拥塞控制和流量控制不同,前者是一个全局性的过程,而后者指点对点通信量的控制。某段时间,若对网络中某一资源的需求超过来该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞
目的
- 拥塞控制是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不至于过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是点对点通信量的控制,是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
方式方法
- 为了进行拥塞控制,TCP 发送方要维持一个拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。
TCP 的拥塞控制采用了四种算法,即:慢开始、拥塞避免、快重传和快恢复。在网络层也可以使路由器采用适当的分组丢弃策略(如:主动队列管理 AQM),以减少网络拥塞的发生。
算法
拥塞避免
- 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送方的 cwnd 加 1。
快重传/快恢复
- 在 TCP/IP 中,快速重传和快恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包。
慢开始
- 慢开始的算法的思路是当主机开始发送数据时,如果立即将大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经实验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是从小到大逐渐增大拥塞窗口数值。cwnd初始值是1,每经过一个传播轮次,cwnd加倍
粘包
场景
- 一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包。
问题
- 接收端收到了两个数据包,但是这两个数据包要么是不完整的,要么就是多出来一块,这种情况即发生了拆包和粘包。拆包和粘包的问题导致接收端在处理的时候会非常困难,因为无法区分一个完整的数据包。
产生原因
发送方
- 采用 TCP 协议传输数据的客户端与服务器经常是保持一个长连接的状态(一次连接发一次数据不存在粘包),双方在连接不断开的情况下,可以一直传输数据。但当发送的数据包过于的小时,那么 TCP 协议默认的会启用 Nagle 算法,将这些较小的数据包进行合并发送(缓冲区数据发送是一个堆压的过程);这个合并过程就是在发送缓冲区中进行的,也就是说数据发送出来它已经是粘包的状态了。
接收方
- 接收方采用 TCP 协议接收数据时的过程是这样的:数据到接收方,从网络模型的下方传递至传输层,传输层的 TCP 协议处理是将其放置接收缓冲区,然后由应用层来主动获取(C 语言用 recv、read 等函数);这时会出现一个问题,就是我们在程序中调用的读取数据函数不能及时的把缓冲区中的数据拿出来,而下一个数据又到来并有一部分放入的缓冲区末尾,等我们读取数据时就是一个粘包。(放数据的速度 > 应用层拿数据速度)
解决方案
- 特殊字符控制
- 在包头首部添加数据包的长度
HTTP状态码
1xx
- 100 Continue :表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应
2xx成功
- 200OK
- 204 No Content:请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。
- 206 Partial Content :表示客户端进行了范围请求,响应报文包含由 Content-Range 指定范围的实体内容
3xx 重定向
- 301 永久重定向
- 302 临时重定向
- 303 临时重定向,但是303要求客户端应该采用GEt方法获取资源
- 304 资源未修改
4xx客户端错误
- 400 参数错误
- 401 认证失败
- 403 Forbidden 请求被拒绝
- 404 资源未找到
5xx服务端错误
- 500 服务器内部错误
- 503 服务器处于超负载状态或者正在停机维护,现在无法处理请求
Forward(直接转发) 和 Redirect(间接转发)区别
- 直接转发方式(Forward):客户端和浏览器只发出一次请求,Servlet、HTML、JSP 或其它信息资源,由第二个信息资源响应该请求,在请求对象 request 中,保存的对象对于每个信息资源是共享的。
- 间接转发方式(Redirect):实际是两次 HTTP 请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个 URL 发出请求,从而达到转发的目的。
HTTP方法
GET
本质
- 一次HTTP请求,并且请求是幂等的
请求参数
- URL拼接,参数数据如果是英文字母或者数字,原样发送,否则以unicode的方式进行编码发送
POST
本质
- 先发头,再发请求体;一般用来更新服务器上的资源
请求参数
- 参数放在请求体,可以用form形式传输或者JSON形式的传输
PATCH
HEAD
OPTIONS
CONNECT
TRACE
HTTP2.0
多路复用
支持服务端推送
压缩请求头
HTTPS
优点
- 使用 HTTPS 协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
- HTTPS 协议是由 SSL + HTTP 协议构建的可进行加密传输、身份认证的网络协议,要比 HTTP 协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性;
- HTTPS 是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
缺点
HTTPS 协议握手阶段比较费时,会使页面的加载时间延长近 50%,增加 10% 到 20% 的耗电;
HTTPS 连接缓存不如 HTTP 高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;
SSL证书需要钱
SSL证书需要绑定IP
数字证书
- 对称加密中,双方使用公钥进行解密。虽然数字签名可以保证数据不被替换,但是数据是由公钥加密的,如果公钥也被替换,则仍然可以伪造数据,因为用户不知道对方提供的公钥其实是假的。所以为了保证发送方的公钥是真的,CA 证书机构会负责颁发一个证书,里面的公钥保证是真的,用户请求服务器时,服务器将证书发给用户,这个证书是经由系统内置证书的备案的。