计网
概念
MTU:网络中一次可以传输的最大数据包的大小
MSS:TCP中除去TCP和IP的头部,能够传输的最大的数据量
SDU,Service Data Unit,服务数据单元。
ISP 是 Internet Service Provider 的缩写,翻译为互联网服务提供商。
协议
Telnet 客户端登录协议,属于应用层
TLD 是 Top-Level Domain 的缩写,翻译为顶级域名
GBN (Go-Back-N) 退回
SR 选择性重传
mask 子网掩码
SDN 是指软件定义网络(Software-Defined Networking)
OSPF(Open Shortest Path First)是一种开放式的链路状态路由协议,用于计算机网络中的动态路由。
Secure sockets layer (SSL)
MSL:报文最大生存时间
TTL:经过的路由跳数
序列号:在建立连接时由内核生成的随机数作为其初始值,通过 SYN 报文传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。
确认号:指下一次「期望」收到的数据的序列号,发送端收到接收方发来的 ACK 确认报文以后,就可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。
控制位: 用来标识 TCP 报文是什么类型的报文,比如是 SYN 报文、数据报文、ACK 报文,FIN 报文等。
面试常问
- UDP是面向报文的:发送方不会对报文进行拆分,所以一个报文就是一个完整的消息,接收方使用队列来区分不同报文
- TCP是面向字节流的:粘包问题:TCP报文会拆分成多个,取决于发送窗口、拥塞窗口以及当前发送缓冲区的大小等条件,所以不容易知道一个用户消息的边界
- 控制位是单独的留出来的几个位置
- TCP面向字节流的,发送的是一个个连续的字节,而UDP是面向数据报的,一个UDP数据报就是一个完整的消息
- 重传机制:1.超时重传,重传时间最好略大于包的往返时间,2.快速重传3.SACK重传,选择性确认 TCP 头部「选项」字段里加一个
SACK
的东西,它可以将已收到的数据的信息发送给「发送方」,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。4. Duplicate SACK,只告诉对方有哪些数据被重复接受了 - 滑动窗口:无需等待确认应答,而可以继续发送数据的最大值
- 拥塞窗口 cwnd是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。 网络没出现拥塞,cwnd增加,出现拥塞cwnd减少
- HTTP:最常使用的是HTTP/1.1
- 优化 HTTP/1.1
- 减少请求次数:1.使用客户端缓存,2.减少重定向次数,3.合并请求,4.延迟发送,只发送一部分内容
- 减少响应数据大小:使用压缩方式
- Keep-Alive:用于保持长连接,keepalive,TCP中的保活机制,HTTP1.1默认是开启的,在请求头中使用
Connection: Keep-Alive
- 强制缓存:服务器直接要求使用浏览器缓存的数据, 协商缓存:服务器会对比缓存过期时间,决定是否过期,返回给浏览器决定是否使用浏览器的缓存
- 队头阻塞:服务端在处理请求时耗时较长导致后面的请求无法即使发送,解决方式 :使用管道:客户端可以直接发送多个请求,服务端根据发送顺序来解决,但是管道技术基本 没人使用
- 演进过程:
- 1.1 使用长连接改善短链接的性能开销,使用管道进传输,改善了队头阻塞。缺点是:header未压缩,只能压缩body,只能从客户端开始发送请求,没有请求优先级
- 2 头部压缩,当同时发送多个请求,如果请求头是一样或者相似的就把重复发部分消除,基于HTTPS的,头部全部使用二进制格式取代原来的纯文本,使用Stream,一个Stream可以包含多个Message,Message中可以包含多个Frame,Frame中包含Headers和Body,Stream都跑在同一个TCP上,客户端收到后会根据相同的Stream ID 有序组装成HTTP消息,Stream流用于多路复用TCP
- 缺点是:由于TCP的是基于字节流的,必须保证收到的字节数据是完整且恋雪的才能将数据返回给应用层
- HTTP/3 使用UDP协议来解决响应的队头阻塞。
- 使用基于UDP的QUIC协议,保证类似的可靠传输
- QUIC 有自己的一套机制可以保证传输的可靠性的。当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响,因此不存在队头阻塞问题。这与 HTTP/2 不同,HTTP/2 只要某个流中的数据包丢失了,其他流也会因此受影响。
- 当某个流丢包时,只会阻塞这个流,其他流不会阻塞,不存在队头阻塞问题
- RSA算法不支持前向加密,只要获取浏览器的私钥,即可破解
- 优化 HTTP/1.1
- HTTPS:
- 使用混合加密:通信建立前使用非对称加密来交换会话密钥, 通信过程中使用对称加密的会话密钥来进行通信
- 公钥运算出的结果,只有使用私钥来进行逆运算得到结果。 发送时,发送者使用接收者的公钥,公钥是可知的,解决了密钥交换的问题,接收者使用自己的私钥进行解密。
- 公钥加密,私钥解密:保证传输过程中内容的加密
- 私钥加密,公钥解密:保证消息不会被篡改。—>数字签名算法
- 使用权威机构CA(数字证书认证机构)来保存数字证书:个人信息+公钥+数字签名
- TCP
- 三次握手的过程
- 客户端发送带有SYN(同步序列)SEQ(序列号) = x 标志的数据包,客户端进入SYN_SEND状态
- 服务端发送带有SYN(SEQ = y) + ACK (ACK = x + 1) 标志的数据包,进入SYN_RECV状态
- 客户端发送 带有ACK(ACK = y + 1) 标志的数据包,二者进入ESTABLISHED状态
- 为什么要第二次传回SYN 用于表明所收到的是对应的客户端发送的信号
- 四次挥手:
- 客户端发送FIN(SEQ = x) ,进入FIN-WAIT-1状态
- 服务端发送ACK(ACK=x+1) 进入CLOSE-WAIT状态,客户端进入FIN-WAIT-2
- 服务端发送FIN(SEQ=y) 请求关闭,进入LAST-ACK
- 客户端发送,ACK(ACK=y+1) ,客户端进入TIME-WAIT,服务端接收后进入CLOSE,客户端等待一段时间之后如果没有收到回复,就关闭客户端。
- 可不可以把ACK和FIN合并起来变成三次挥手: 不行,因为服务器收到断开请求时,可能还有一些数据没有传输完成,所以先发送ACK表明收到请求,等待所有数据发送完成之后发送FIN断开连接
- 三次握手的过程
- IP
- DNS:域名解析:
- DHCP(动态主机配置协议)是一个网络协议,用于自动分配 IP 地址和其他相关配置信息给网络中的设备。这使得设备可以在加入网络时自动获取网络配置,无需手动设置。
- ARP工作原理:广播问询,单播响应
- 一个局域网中
- 维护一个ARP表 <IP,MAC,TTL>
- 查询ARP表,如果不存在,则构造一个ARP查询分组,将其广播到局域网中,MAC地址为广播地址,然后希望收到的是IP地址
- 设备接收后查询是否为自己的IP,如果不是则丢弃,如果是,则构造ARP响应分组,发送给查询主机,并在自己的表中构造一条查询主机的IP-MAC映射表,使用的是单播,不再广播
- 查询的主机接受后,将其加入ARP表中
- 不在一个局域网中:通过路由器转发查询
- 一个局域网中
- NAT:同一个场景下将私有IP转化为共有IP地址
- ICMP:互联网控制报文协议,确认Ip包是否
- ping:基于ICMP协议工作的,使用的ICMP类型中0和8,也就是回送应答和会送请求,根据这个来判断是否到达IP地址,如果路由器中间没有找到对应的接收端IP就会往发送端IP发送ICMP报文,8是源主机向目标主机的发送的请求,0是目标主机的回应
- 各种本地IP代指的区别:
- localhost 默认就是同于127.0.0.1,但是可以修改,是属于域名
- 0.0.0.0 IPv4中是无效地址,代指的是广播,监听本地的0.0.0.0时,代表的监听本机上所有的IPv4地址
- 127.0.0.1是回环地址
- IGMP:Internet组管理协议,工作哎主机和最后一跳的路由之间。
- 为何断网了也能ping通127.0.0.1? 因为会把消息交给本地网卡,本地网卡直接把消息发送到本机接受到的消息链表中并触发软中断,由内核线程来传递给上层应用程序
IP
分类
TCP
如何解决粘包问题
找到消息的边界就能解决这个问题
- 固定长度
- 特殊字符作为边界
- 自定义消息结构
重传机制
重传是由序列号和确认应答来控制的
- 超时重传,TCP的超时重传策略是间隔时间每次都设置为先前值的两倍,如果出现两次超时,说明网络环境差,不会重传了
- 快速重传:当收到三个相同ACK报文时,说明出现了丢包,会重传丢失的报文。
[滑动窗口](4.2 TCP 重传、滑动窗口、流量控制、拥塞控制 | 小林coding (xiaolincoding.com))
TCP头中有一个Window字段,代表滑动窗口大小。表示接受方告诉对方自己还有多少缓冲区可以接受数据。
发送方窗口
HTTP
基本概念
HTTP是一个在计算机世界中专门在亮点之间传输文字、图片等超文本的约定与规范
常见的状态码
- 1xx 是一种中间状态,实际使用较少
- 2xx 表示服务器成功处理了请求
- 200 OK
- 204 No Content 与200基本相同,但是响应头没有body数据
- 206 Partial Content表示响应返回的body数据并不是资源的全部。
- 3xx 重定向
- 301 永久重定向
- 302 Found 临时重定向,注意301和302都会在响应头中使用Location字段知名后续需要跳转的URL,浏览器会自动重定向到新的URL
- 304 资源未修改,可以使用缓存资源
- 4xx 客户端发送的报文有误
- 400 请求有误,笼统的错误
- 403 服务器禁止访问资源
- 404 服务器不存在或未找到
- 5xx 客户端请求报文正确,但是服务器处理时,内部出现了错误,属于服务端错误码
- 500 笼统错误
- 501 客户端请求功能不支持,敬请期待
- 502 网关错误
- 503 服务器繁忙,无法咱是无法响应客户端。
HTTP缓存
- 强制缓存:浏览器判断缓存没过期就强制使用本地缓存。使用的是Cache-Control和Expires,第一个是相对时间,第二个是绝对时间。第一个优先级更高。
- 浏览器第一次请求时,会加上这个过期时间
- 再次请求时,根据请求时间和这个过期时间进行比较,来判断是否过期,并且更新这个时间
- 协商缓存: 与服务器协商之后,通过协商结果来判断是否使用本地缓存。
不同版本的HTTP特点
HTTP: 80
HTTPS: 443
HTTP缓存
Cache-Control(相对时间)优先级高于Expires(绝对时间)
强制缓存是浏览器中的缓存没过期就强制使用缓存,协商缓存是每次与服务器协商是否过期。
HTTP的迭代和对比
HTTP1.1
已经实现了长连接和管道网络传输(不需要一问一答,可以连续发送请求)
解决了 请求的队头阻塞,但是没解决响应的队头阻塞。
头部冗长,未压缩,请求只能由客户端开始
优点和缺点
双刃剑:无状态、明文传输
缺点:不安全
- 无状态可以使得浏览器不需要额外记忆HTTP的状态,缺点是处理有关联性的操作时会很麻烦
- 解决方式就是使用Cookie
- 明文传输:方便调试的同时不安全
- 不安全:1. 明文传输2.不验证通信双方的身份3.不能证明报文的完整性
- 解决方式使用HTTPS
性能(长连接)
- 相比较于1.0,1.1使用了长连接,一次TCP连接发起多次请求
- 可以使用管道通信,只要请求发送出去后,不需要等待响应结果即可发送下一个请求
解决了请求的队头阻塞,但是没有解决响应的队头阻塞,同时不是默认使用的队头阻塞是指当一个请求因为某种原因被阻塞,会导致后面排队的所有请求都一同被阻塞
进步: - 长连接
- 支持管道网络传输
缺点: - Header部分未经压缩就发送,延迟大,只能压缩Body部分
- 会出现队头阻塞:服务端响应慢,导致后续的请求不能及时发送
- 请求只能从客户端开始
HTTP/2
进步:
- HTTP/2是基于HTTPS,安全有保证
- 队头压缩:如果同时发出多个请求,他们的请求头是一样的或者是相似的,就会消除重复的部分,原理是客户端和服务端同时维护一张头信息表,所有字段都会存在里面来进行索引
- 二进制格式:报文使用二进制格式,而不是使用纯文本的格式
- 并发传输,多路复用,一条TCP连接包含多个Stream,StreamID来区分,不同Stream的帧是可以乱序发送的
- 服务器可以主动推送资源
虽然在HTTP层解决了队头阻塞,但是TCP是字节流协议,导致必须满足一个一个字节才能够读取数据,从而降低效率,一旦丢包,必须进行TCP的重传,就会导致效率降低。
HTTP/3
使用UDP来进行传输
QUIC协议
QUIC协议也实现了Stream的概念,从而某个流发生丢包时,只会则色这个流,而不会阻塞其他流,从而不会存在队头阻塞。
QUIC是google设计的一个基于UDP的网络传输协议,旨在替代TCP协议以提供更快的连接建立和数据传输速度。
- 快速建立连接:使用基于TLS的安全连接,同时将连接的建立与TLS握手合并,从而减少了连接所需要的往返时间。
- 多路复用:允许在单个连接上同时进行多个独立的数据流,从避免了TCP连接中的队头阻塞
- 零RTT握手:QUIC支持零往返时间握手,允许客户端在第一次连接时发送数据,无需等待握手完成,进一步减少了连接建立时间。
- 动态调整拥塞控制:使用更先进的拥塞控制算法,能够动态的根据网络条件调增数据传输速率。
- 错误恢复:QUIC内置了一些错误恢复机制,包括快速重传和前向错误纠正,能够在发生丢包或网络拥塞时更快的恢复数据传输。
HTTP/2 是⼀个应⽤层协议,是 HTTP/1.1 的后继版本,旨在提⾼ Web ⻚⾯加载速度和性能。 HTTP/2
在传输层使⽤了⼆进制分帧,头部压缩,多路复⽤等技术,以减少延迟和提⾼效率。 HTTP/2 不是⼀个
替代传输层协议,⽽是在传输层上实现的 HTTP 协议的增强版本。
HTTPS
HTTPS是在TCP和HTTP之间加入了SSL/TLS安全协议
核心
- 混合加密:对称加密和非对称加密的混合加密方式,通信建立之前使用的是非对称加密,建立之后通信使用的对称加密,对称加密只需要使用一个密钥,所以更加高效。
- 摘要算法 + 数字签名:通过摘要算法获得哈希值,来判断报文是否被修改。而数字签名则能保证通信双方的身份
- 数字证书:可信的第三方来保证双方身份,主要是CA通过私钥加密双方的公钥数字签名,然后CA的公钥是公开的,之后另一方通过CA的公钥解密获得对方的公钥,之后对方使用私钥加密,就可以使用公钥进行解密了或者是加密通信。
非对称加密
- 公钥加密,私钥解密:保证内容的安全,只有私钥可以解密内容
- 私钥加密,公钥解密:保证消息不可冒充,因为私钥是不可以泄漏的,验证双方身份,也就是数字签名算法
流程(RSA算法为例)
- 三次握手建立TCP连接
- 客户端发送ClientHello请求,携带客户端支持的TLS版本信息和客户端随机数Client Random,支持的密码套件列表(比如RSA算法)
- ServerHello响应:确定TLS版本,浏览器不支持就断开,服务器随机数Server Random, 使用的加密算法,服务器的数字证书
- 客户端使用CA的公钥确定证书的真实性,之后取出公钥,加密报文发送:1. 随机数 pre-master key 2.加密通信算法改变通知,表示之后都将使用会话密钥(对称加密)进行通信,客户端握手结束通知,把之前所有的内容进行摘要,给服务器进行校验
- 双方使用这三个随机数和加密算法生成会话密钥
- 服务器最后1.加密算法改变 2.握手结束,生成摘要供客户端校验
HTTPS抓包/代理人
抓包工具的原理就是往系统受信任的根证书列表导入抓包工具生成的证书,这个证书会被浏览器新人,也就是转包工具给自己建立了一个CA。
如何解决中间人攻击:使用HTTPS双向认证,服务器也对客户端的认证信息进行验证。
计网常问
一个请求整个网络的处理
- 浏览器解析URL生成HTTP消息
- 通过DNS解析获得IP地址
- 之后将HTTP的传输工作通过调用Socket库交给操作系统的协议栈
- TCP简历链接需要三次握手,保证双方都有发送和接收的能力
- 建立连接之后,TCP报文中的数据部分就是存放HTTP头部+数据,组装好TCP报文之后,交给下面的网络层处理
- IP协议里需要源地址和目的地址IP,存在多个网卡时,需要根据路由表规则。
- 生成IP头部之后,需要在前面加上MAC头部,接收方的MAC地址通过ARP协议获得,并且放入ARP缓存
- 网卡驱动获得网络包,将其复制到网卡内的缓存区中,从开头加上包头和起始帧分节符,末尾加上用于校验错误的帧校验序列。之后网卡将包转为电信号,通过网线发送
- 电信号到达网线接口,交换机里的模块进行接收。之后将电信号转化为数字信号。FCS校验没问题后放入缓冲区,之后查询MAC地址,如果找不到,就发除了源端口的所有端口。
- 电信号到达⽹线接⼝部分,路由器中的模块会将电信号转成数字信号, FCS 进⾏错误校验没问题后确认接收⽅MAC地址,然后去掉MAC头部,查询路由表判断转发⽬标,如果⽹关为空则 IP 头部中的接收⽅ IP 地址就是要转发到的⽬标地址
- 知道对⽅的 IP 地址之后,接下来需要通过 ARP 协议根据 IP 地址查询 MAC 地址,加上MAC头部,发送⽹络包,通过交换机到达下⼀个路由器
- 最后数据包抵达了服务器
IPv6优点
- 更⼤的地址空间:IPv6将地址⻓度从IPv4的32位扩展到了128位,理论上可以分配⼤约3.4x10^38个唯⼀的IP地址。
- 简化的报⽂格式:IPv6头部格式更为简洁,减少了处理的复杂性,提⾼了路由效率。
- 改进的服务质量(QoS):IPv6⽀持更好的流量分类和优先级处理,有助于提供更加可靠的服务质量。
- 内建的安全机制:IPv6原⽣⽀持IPsec(⽹络安全协议),为数据传输提供了端到端的加密和认证。
- ⾃动配置能⼒:IPv6⽀持有状态和⽆状态的地址⾃动配置(SLAAC),简化了⽹络设备的配置和管理
BGP、OSPF协议原理
边界⽹关协议(Border Gateway Protocol,简称BGP)和开放最短路径优先协议(Open Shortest Path
First,简称OSPF)是世界上最流⾏的两种基于标准的动态路由协议。
三握四挥
TCP和UDP
- 序列号:建立连接时,由计算机生成的随机数作为初始值,通过SYN包传给接收端主机,每发送一次,就累加一次该数据字节数的大小,解决网络包乱序问题。
- 确认应答号:下一次期望收到数据的序列号。发送端收到这个之后可以认为在这之前的数据都被正常接收,用于解决丢包问题。
- 控制位为1时:
- ACK:确认应答变为有效,TCP规定除了最初建立连接时的SYN包之外必须设为1
- RST:标识连接异常必须强制断开连接
- SYN:表示希望建立连接
- FIN:今后不会再有数据发送,希望断开连接时,表示今后不再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方可以交换FIN位为1的TCP段。
SYN攻击
攻击者短时间伪造不同的IP地址的SYN报文,沾满服务端的办理按揭队列,导致客户端无法和服务端建立连接。
解决方案:
- 增大netdev_max_backlog:网卡接收数据包的数据大于内核处理速度时保存数据包的队列长度
- 增大TCP半连接队列:
- 增大net.ipv4.tcp_max_syn_backlog
- 增大listen()函数中的backlog
- 增大net.core.somaxconn
- 开启net.ipv4.tcp_syncookies,就可以在使用SYN半连接的情况下成功建立连接。
- 减少SYN+ACK重传次数,tcp_synack_retries内核参数
- Anti-DDoS系统拦截客⼾端发送的SYN报⽂,代替服务器向客⼾端发送SYN-ACK报⽂,如果客⼾端不应答,则认为该客⼾端为虚假源;如果客⼾端应答,则Anti-DDoS系统认为该客⼾端为真实源,并将其IP地址加⼊⽩名单,在⼀段时间允许该源发送的所有SYN报⽂通过,也不做代答。
滑动窗口
滑动窗口机制允许发送方在等待接收方确认之前发送多个数据包,从而提高数据传输效率。
为了解决一发一答的效率问题。窗口的实现实际上是操作系统开辟一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据,如果按期收到确认应答,这个数据就可以从缓冲区删除。
慢启动
当连接开始时,以指数速率增加发送速率,直到第一次报文丢失事件发生为止。
初始:拥塞窗口值cwnd = 1 MSS
每RTT倍增cwnd
每收到一个ACK,增加cwnd
初始速率很低,但是以指数增加
阻塞控制
- 慢启动:发送方每收到一个ACK,拥塞窗口cwnd大小指数增加
- 拥塞避免算法:当cwnd超过慢启动门限ssthresh就会进入拥塞避免算法:每个 RTT(往返时间)增加 1 个 MSS,而不是每个 ACK 增加 1 个 MSS。
- 拥塞发生:发生了 超时重传时,sshtresh设置为cwnd/2,cwnd恢复为初始化值,发生快速重传是,cwnd =cwnd/2,ssthresh=cwnd并进入快速恢复算法。
- 快速恢复
DNS
主机名到IP地址的转换
主机别名:一个主机可以有一个规范主机名和多个主机别名。
邮件服务器别名:负载分配:DNS实现冗余服务器,一个IP地址集合可以对应同一个规范主机名。
DNS客⼾端设置使⽤的DNS服务器⼀般都是递归服务器,它负责全权处理客⼾端的DNS查询请求,直
到返回最终结果。⽽DNS服务器之间⼀般采⽤迭代查询⽅式。
DNS劫持
通过某些手段获得对某域名的解析控制权,修改此域名的解析结果,导致对该域名的访问由原IP转为修改后的指定IP,记过就是对特定网站不能访问/访问的是假网站
防止:限制对DNS的访问、设置较小的TTL值,定期修改域名管理系统的账号,使用支持DNSSEC的注册商,使用可靠的DNS服务商。
DNSSEC(Domain Name System Security Extensions,域名系统安全扩展)是一组用于保护 DNS(域名系统)信息安全的协议和技术。它通过数字签名验证 DNS 数据的真实性和完整性,防止 DNS 缓存投毒和其他类型的攻击。
网络核心
概念:路由器的网状网络
提问: 数据怎么通过网络进行传输?
- 电路电路交换: 不可共享资源,会造成资源浪费,不适合计算机之间的通讯,计算机通信的特点: 突发性,耗时短
- 分组交换: 存储 – 转发 , 数据转发过程中使用所有的资源,而不是使用一部分pieces,会将所有的的分组都存储之后再进行转发,方便共享的实现
应用层
- 应用架构
- CS体系 客户-服务器:
- 服务器: 一直运行,固定ip和周知的端口号,扩展性差
- 客户端: 主动与服务器通信,可能是动态ip,不直接与其他客户端通信
- P2P 每个端都可以作为服务器,点对点
- 混合体 c/s + P2P
- CS体系 客户-服务器:
- TCP socket :对于面向连接服务(TCP) 的应用而言,socket是四元组的一个具有本地意义的标示,相当于一个记录特定会话的指针,只需要用socket就可以指定这个应用
- socket 其实是应用层和传输层之间的,使得允许应用能发起通信,与其他主机上的应用进程进行通信
- 4元组 源IP 源port 目标IP 目标port
- 唯一指定了一个会话
- 应用使用这个标示,与远程的应用进程进行通讯
- 不必在每一个报文中都指定这四元组
- udp 只提供源主机的ip 和 port
- WebSocket 工作过程:
- 客户端发送一个HTTP请求,包含升级字段
- 服务器接收之后,进行协议升级,如果支持,会返回一个101状态码,包含一些对应响应头
- 进行双向通信,数据以帧的方式传送。
- 其中一方发送一个关闭帧,二者关闭TCP连接
- 通过心跳机制保证WebSocket的稳定性和活跃性
- UDP socket
UDP 两个进程之间的通信之前不需要建立连接,每个报文独立传输,前后报文可能给不同的分布式进程
udp socket 记录本IP 本port 但是传输报文时,需要提供对方ip, port ,接收报文时传输层需要上传对方IP port
二元组: 源IP 源port
TCP 服务:
可靠的传输服务
流量控制:发送方不会淹
没接受方
- 拥塞控制:当网络出现拥
塞时,能抑制发送方
不能提供的服务:时间保证、最小吞吐保证和安全
面向连接:要求在客户端进程和服务器进程之间建立连接
UDP 服务:
不可靠数据传输
不提供的服务:可靠,流量控制、拥塞控制、时间、带宽保证、建立连接
UDP存在的必要性能够区分不同的进程,而IP服务不能
在IP提供的主机到主机端到端功能的基础上,区分了主机的
应用进程
- 无需建立连接,省去了建立连接时间,适合事务性的
应用
- 不做可靠性的工作,例如检错重发,适合那些对实时
性要求比较高而对正确性要求不高的应用
- 因为为了实现可靠性(准确性、保序等),必须付出时间代
价(检错重发)
- 没有拥塞控制和流量控制,应用能够按照设定的速度
发送数据
- 而在TCP上面的应用,应用发送数据的速度和主机向网络发送
的实际速度是不一致的,因为有流量控制和拥塞控制
- 安全TCP
TCP和UDP都没有加密,明文传输
使用SSL协议来实现加密,在TCP的基础上实现,提供加密的TCP,私密性,数据完整性,段堆到端的鉴别
SSL socket API 应用通过API将铭文交给socket,SSL将其加密
URL : 访问协议 + 用户名 + 口令字 + 端口等
常见的应用层协议
HTTP面试题
状态码:
- 200
- 204 No Content 响应头没有body数据
- 206 Partial Content 表示返回的body数据不是资源的全部,只是一部分
- 301 Moved Permanently 永久重定向,请求的资源已经不存在的
- 302: Found: 表示临时重定向,301,302都会在响应头中使用字段Location指明后续要跳转URL,浏览器会自动重定向到新的URL
- 304:Not Modified 告诉客户端可以接着使用缓存资源
- 400Bad Request 报文有错
- 403 Forbidden 禁止访问
- 404 Not Found 资源不存在或者没找到
- 500 Internal Server Error 服务器内部错误
- 501 Not Implemented 客户端请求还不支持
- 502 Bad Gateway 通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
- 03 Service Unavailable 服务器忙,暂时无法响应
缓存技术:把请求-响应的数据存到本地,下一次直接都本地数据,不需要等待服务器的想用了
- 强制缓存
Cache-Control
, 是一个相对时间;Expires
,是一个绝对时间;
- 协商缓存
- 在强制缓存未命中时,服务器第一次请求资源时,会在Response头部加上ETag唯一表示
- 当浏览器再次请求访问服务器中的资源时,先检查缓存是否过期,如果没有过期直接使用本地缓存,如果过期了会在Request头部上加上If-None-Match紫萼段
- 服务器再次收到请求之后,会根据请求中的If-None-Match值是否与当前请求的资源生成的唯一标识比较
- 如果值相等,返回304 Not Modified 不会返回资源
- 如果不相等,则返回 200 状态码和返回资源,并在 Response 头部加上新的 ETag 唯一标识;
- 浏览器收到304响应码,会从本地加载资源否则更新资源。
- 强制缓存
HTTP/1.1 的优点:简单灵活、应用广泛
- 缺点是:无状态一方面可以不需要服务器使用额外的资源来记录状态信息
- 坏处是:进行关联性操作时,需要每次都验证一次身份
- 解决方法:使用Cookie
HTTP:超文本传输协议 HTTP默认80 HTTPS默认 443
- 流程: 1. 客户发起一个与服务器的TCP连接,(建立socket) 2. 服务器接受TCP 连接 3. 浏览器和web服务器之间交换HTTP报文 4. TCP连接关闭
- HTTP 是无状态的连接,不会维护任何和客户有关的信息,这时候就需要websocket了
- HTTP/1.1 之后默认使用持久连接,保证了多个u第项可以在一个TCP连接上传输 ,非持久连接下载多个文件需要及案例多个TCP连接
响应时间
往返时间 RTT round - trip - time: 一个小的分组从客户端到服务器,再回到客户端的时间,传输时间忽略不计
响应时间为: 2RTT + 传输时间
1. 一个RTT 用来发起TCP请求
2. 一个用来HTTP请求和等待响应
3. 文件传输时间
持久HTTP : 一个TCP连接建立之后,不会断开然后进行多个HTTP请求
服务器在发送响应之后仍然保持TCP连接
在相同客户端和服务器之间的后续请求和响应报文通过相同的连接进行传送
客户端,在遇到一个引用对象的时候就可以尽快的发送该对象的请求,
1. 每个对象要两个RTT
2. 操作系统必须为每一个TCP连接分配资源,但是浏览器通常并行打开TPC连接,以获得引用对象
两种方式:
1. 非流线方式的持久HTTP,客户端只能在前一个HTTP请求响应之后才能发送新的请求,每个引用对象花费一个RTT
2. 流水线方式:客户端遇到一个引用对象(一个小的ui所指的资源)之后就立即产生一个请
3. 所有(小)的引用对象只花费一个RTT是有可能的
HTTP 报文格式 : 请求行 + 请求头 + (request body)
tips : PUT 请求是将实体对象中文件载到URL指定的路径(一般是更新资源)
POST 不需要在URL 中指定资源位置,一般用于创建资源- 缓存:命中率(h): 百分之多少的请求可以在缓存中满足
- 接入链路的利用率: (1-h) * 请求速率 / 带宽
FTP 文件传输协议(基于TCP)
ftp服务器端口号默认为 21,需要建立两个TCP连接,一个用于控制,一个用于传输SMIT 电子邮件的邮件传输协议 (默认端口25)
用于上传邮件,和HTTP的区别,HTTP的每个对象封装在各自的响应报文中,SMIT可以将多个 引用对象封装在一个报文中
报文格式:
HEAD
To :
From :
Subject:
BODY:
报文- MIME 多媒体邮件扩展
- POP 邮局访问协议 用户确认身份(代理 <–>服务器)并下载
- POP3 不保留会话状态 本地管理文件夹
- IMAP Internet 邮件访问协议,保留用户状态 远程管理文件夹
DNS Domain Name System 建立IP 地址和 对应域名之间的映射
DNS默认默认端口是53
主要思路:分层,基于域的命名机制,在若干分布式的数据库上完成转换
也可以做到负载均衡
域名结构:使用层次树状结构来进行命名
域名结构:从本域开始往上直至树根,域严格遵循组织界限,而不是物理网络
DNS 记录格式
RP格式: (name,value,type , ttl)
type=A 时, name 为主机 value 为IP
=CNAME Name 为规范名字的别名
=NS Name 为域名 (foo.com) value 为该域名的权威服务器的域名
=MX Value 为name对应邮件服务器名字- 应用调用 解析器(resolver)
- 解析器作为客户 向Name Server发出查询报文(封装在UDP段中)
- Name Server返回响应报文(name/ip)
- 本地名字服务器 Local Name Server 起到代理的作用,将查询转发到DNS服务器
- 不严格属于层次结构,每个ISP 都有一个本地DNS,优先去本地DNS服务器中查询
- 递归查询:本地LNS 无,直接 去找权威服务器,然后从权威服务器往下开始查询,只需要向一个服务器去请求,然后由这个服务器去查询或者去向其他服务器来进行查找,最终由这个服务器来返回结果
- 迭代查询:转发到服务器,如果这个服务器没有就告诉发起请求的服务器要去查询下个一个服务器,由请求服务器去接着请求其他服务器,最终由能查询到的服务器来返回结果,就可以降低根服务器的负荷了
- 缓存,一旦名字服务器得到了一个映射,就将该映射缓存起来,根服务器一般在本地服务器中缓存着,使用TTL (Time to Live)
- 攻击DNS的方法:
- DDoS攻击:对根服务器进行流量轰炸,发送大量的ping
- 向TLD(权威,顶级域名)攻击
- 重定向攻击:
CDN 内容分发网络:在CDN节点中存储内容的多个拷贝,用户请求重定向到最近的一个CDN节点
传输层
提供服务:为运行在不同主机上应用程序提供逻辑通信
数据元为报文段
与网络层的区别:网络层提供不同主机之间的逻辑通信,传输层提供的应用程序之间的通讯
tips:TCP和UDP都不提供延时保证和带宽保证,都支持多路复用和解复用,TCP额外提供拥塞控制和流量控制,以及建立连接
- 多路复用/解复用:多路复用指的是许多个信号或数据流共享同一物理通信通道,解复用指的是根据报文段的头背部信息中的IP地址和端口号将接受的报文段发给正确的socket
- 为何要有UDP :
- 不建立连接(会增加延时)
- 简单:在发送端和接收端没有连接状态
- 报文段的头部很小(开销小)
- 无阻塞控制和流量控制可以保证UDP尽快的发送报文段,应用-> 传输速率 = 主机 -> 网络的速率
- UDP也会进行校验,但是只是通过校验和的方式来检测是否遭到篡改
- RDT 是一种模型: RDT(Reliable Data Transfer)是一种可靠的数据传输协议,用于在不可靠的通信信道上实现可靠的数据传输。
- RDT 1.0(停等协议):相信信道可靠
- 发送方只发送一次数据,不进行重传。
- 接收方只接受一次数据,不进行重传请求。
- 适用于理想化的通信信道,不考虑错误和丢失。
- RDT 2.0(回退N协议): 相信会出现bits errors
- 使用checksum 来进行错误检验
- 引入了有限状态自动机,来切换来指定发送者和接收者
- 发送方发送数据帧,并等待接收方的确认帧。
- 接收方接收数据帧,发送确认帧。
- 如果发送方未收到确认帧,它将重传数据帧。
- 接收方可能收到重复的数据帧,但通过带有序号的数据帧来排除重复。
- 问题:如果ACK或者NCK传错了,就会重复
- RDT 3.0
- 机制:在超过合理时间之后进行重传
- 如果package(或ACK)只是被延迟了:
- 重传将会导致数据重复,但利用序列号已经可以处理这个问题
- 接收方必须指明被正确接收的序列号
- 需要一个倒计数定时器
- 停等协议:发送方发送一个分组,然后等待接收方的应答
- ACK NAK NAK 是negative ACK
- RDT 1.0(停等协议):相信信道可靠
- TCP:
- 点对点:一个发送方,一个接收方
- 可靠的、按顺序的字节流:没有报文边界
- 管道化:TCP拥塞控制和流量控制设置窗口的大小
- 面向连接:交换数据之前,通过握手来初始化双方的状态变量
- 流量控制:发送方不会淹没接收方
- 序号:报文段首字节在字节流的编号
- 确认号:期望从另一方收到的下一个字节的序号
- TCP超时时间= EstimatedRTT + 安全边界时间
- 。。。。待续
网络层
DU 为 数据包
- 服务:在发送和接收主机之间传送段
- 功能:
- 转发:将分组从路由器的输入接口转发到合适的输出接口上
- 路由:使用路由算法来决定分组从发送主机到目标接收主机的路径
- 数据平面:转发
- 控制平面:路径
- 路由器的结构:
- 路由:运行路由选择算法生成路由表
- 转发:从输入到输出链路交换数据报,根据路由表进行分组的转发
- 查表方式:
- 最长前缀匹配
- 交换结构:
- 通过内存交换,在cpu的直接控制下进行交换
- 使用总线进行交换: 数据报通过共享总线进行转发,交换速度受限于总线带宽
- 使用互联网络进行交换
- 调度机制: 调度指的是选择下一个要通过链路交换的分组
- FIFO
- 优先权调度
- 轮询
- IP
- IP地址是对主机或者路由器的接口进行编址
- 接口指的是 主机/路由器 和 物理链路的连接处
- 关系是1 : 1
- 子网:
- 一个子网内的节点,他们IP地址的高位部分都相同,这些节点叫做子网
- 无需路由器介入,子网内的个主机在物理上是可以直接打到
- 将子网掩码转为二进制,则为1的部分代表着IP地址中的这一部分是网络中的地址,为0的部分是标识子网中的主机
- 分类:根据第一个8位bit来进行分类
- A 类 最高位固定为0:也就是 1 - 126 7 位网络 24 位主机
- B : 10 128 - 191 14位 网络 16主机
- C : 110 192 - 223 21位 网络 8位主机
- D : 224 - 239 用于多播
- E : 240 - 255 保留用于实验和研究目的
- CIDR Classless InterDomain Routing 无类域间路由
- 也就是 a.b.c.d/x x是子网掩码(mask)
- NAT 网络地址转换
- 将私有网络中的内部IP映射到公共网络中的单个IP地址
节省IP地址:NAT允许多个内部设备共享一个公共IP地址,因此可以延长IPv4地址池的使用寿命。
增强网络安全性:因为内部设备的私有IP地址不直接暴露在互联网上,NAT提供了一层基本的安全性,可以隐藏内部网络结构。
简化网络管理:NAT可以使网络管理员更轻松地管理多台设备,而无需为每个设备分配唯一的公共IP地址。
- IPv6
- IPv4和IPv6通信方式:隧道 Tunneling, 在IPv4路由器之间传输的IPv4报文中携带PIv6的报文
- SDN
- OpenFlow
- route 路由,按照某种指标找到一条从源节点到目标节点的较好路径
- 路由算法分为 全局和 分布式
- 全局:
- 所有边都拥有完整(所有的拓扑)的拓扑和边的代价的信息
- link state LS 链路状态路由选择算法
- 分布式:
- 路由器只知道与它物理连接关系的邻居路由器和到响应邻居路由器的代价
- 迭代的与邻居路由器交换路由信息,计算路由信息
- distance vector DV算法 距离矢量路由选择算法
- RIP(Routing Information Protocol)是一种用于计算机网络中的距离矢量路由协议
- OSP
- DNS 主机向要访问->向DNS查询IP地址->所查询的DNS服务器未知要查询的IP地址->向根域名服务器查询->根域名服务器收录了这个地址 ->返回地址给客户端->客户端建立通信
网络层解决一个两个网络之间的问题,链路层要解决点对点传输的问题 - ARP:以目标IP地址为线索,来定位下一个应该接受数据分包的网络设备的MAC地址,沟通IP和MAC地址 **IP->MAC **数据元为 frame 帧,帧的头部时使用MAC地址来标示源和目的地
- ARP记录一个<IP,MAC,TTL> 的表,TTL是生存周期
- RARP MAC->IP
实现是在适配器上实现的,例如以太网卡 - WAN 广域网 网络形式采用点到点链路
- LAN 局域网 一般采用多点连接的方式
- 奇偶校验
- 单bit奇偶校验只能检测单个bit级别的错误,不能纠错
- 二维奇偶校验可以检测和纠正单个bit错误
- checksum
- CRC 循环冗余校验
网络接口层:等价数据链路层,使用mac地址
NIC的驱动程序
NIC 是网络适配器,也就是网卡
PPP也属于数据链路层
物理层
OSI参考模型 有七个分层
自上而下 每一层的功能和作用由协议规定,协议的内容是规范
应用层
- 针对特定应用的协议
表示层
- 设备固有数据格式和网络标准数据格式 比如:接受不同表现形式的信息
会话层
- 负责通信管理,负责建立连接和断开,管理传输层以下的分层
传输层
- 管理两个节点之间的数据传输,负责可靠传输
网络层
- 路由选择与地址管理
数据链路层
- 互连设备之间传送,和 识别数据帧
物理层
- 界定连接器和网线的规格,比特流和电子信号转换
网络安全
- 对称加密:发送方和接收方的密钥相同
- 公开密钥加密:发送方使用接收方的公钥进行加密,接收方使用自己的私钥进行解密
- 数字签名: