计算机网络
2021-05-13 09:17:05 23 举报
AI智能生成
面试计算机网络
作者其他创作
大纲/内容
TCP
<br>
三次握手
<br>
挥手
拥塞算法
SSL
IP <br>
<br>
输入URL
解析 URL<br>生产 HTTP 请求信息<br>DNS解析<br> TCP连接<br> 发送HTTP请求<br> 服务器处理请求并返回HTTP报文<br> 浏览器解析渲染HTML页面<br> 连接结束
- 第一步工作是解析 URL<br>
生产 HTTP 请求信息
DNS解析:查询服务器域名对应的 **IP** 地址
- 本地 DNS 服务器:缓存里的表格<br>- 否则:根域名服务器,不直接用于域名解析,但能指明一条道路。
应用程序(浏览器)通过调用 Socket库委托协议族工作
TCP连接:负责**收发数据**的 TCP 和 UDP 协议,接受**应用层的委托执行收发数据的操作**。
IP 协议控制网络包收发操作:将网络包发送给对方的操作就是由 IP 负责的。
ICMP
传送过程中产生的错误以及各种控制信息。
ARP
IP 地址查询相应的以太网 MAC 地址。
网卡<br>
数字信息转换为电信号
靠网卡驱动程序。
有Mac地址<br>
交换机
交换机的端口不具有 MAC 地址
MAC 地址表缓存数据包<br>
交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口。
数据包通过交换机转发抵达了路由器,离开子网
路由器
路由器是基于 IP 设计的,俗称三层网络设备,路由器的各个端口都具有 MAC 地址和 IP 地 址;<br>
1. 输入url后:解析Url<br>2. DNS解析:首先需要找到这个url域名的服务器ip,为了寻找这个ip,浏览器首先会寻找缓存,查看缓存中是否有记录,缓存的查找记录为:浏览器缓存-》系统缓存-》路由器缓存,缓存中没有则查找系统的hosts文件中是否有记录,如果没有则查询DNS服务器,<br>3. 构造Http请求:得到服务器的ip地址后,浏览器根据这个ip以及相应的端口号,构造一个http请求,这个请求报文会包括这次请求的信息,主要是请求方法,请求说明和请求附带的数据,<br>4. TCP连接:并将这个http请求封装在一个tcp包中,这个tcp包会依次经过传输层,网络层,数据链路层,物理层到达服务器,服务器解析这个请求来作出响应。<br>5. 响应返回html:服务器解析这个请求来作出响应,返回相应的html给浏览器,因为html是一个树形结构,浏览器根据这个html来构建DOM树,在dom树的构建过程中如果遇到JS脚本和外部JS连接,则会停止构建DOM树来执行和下载相应的代码,这会造成阻塞,这就是为什么推荐JS代码应该放在html代码的后面<br>5. 之后是渲染页面,因为html文件中会含有图片,视频,音频等资源,在解析DOM的过程中,遇到这些都会进行并行下载,浏览器对每个域的并行下载数量有一定的限制,一般是4-6个,当然在这些所有的请求中我们还需要关注的就是缓存,缓存一般通过Cache-Control、Last-Modify、Expires等首部字段控制。 <br>
socket编程
Linux内核中会维护两个队列:
未完成连接队列(SYN 队列)
接收到一个 SYN 建立连接请求,<br>处于 SYN_RCVD 状态;
已完成连接队列(Accpet 队列)
已完成 TCP 三次握手过程,<br>处于 ESTABLISHED 状态;
客户端 connect 成功返回是在第二次握手<br>,服务端 accept 成功返回 是在三次握手成功之后。
抓包工具<br>
tcpdump
仅支持命令行格式使用
Wireshark
可视化分析网络包的图形页面。
curl
http://www.ruanyifeng.com/blog/2019/09/curl-reference.html
不带有任何参数时,curl 就是发出 GET 请求。
相关
缓存
前端缓存
https://juejin.cn/post/6844903747357769742
优先级:<br> Service Worker<br> Memory Cache<br> Disk Cache<br> 网络请求<br>
强缓存和协商缓存
强缓存<br>
利用HTTP头中的Expires和Cache-Control两个字段来控制的,<br>用来表示资源的缓存时间
Expires
Http1.0
Cache-Control
Http1.1
max-age:相对时间
no-cache:不使用本地缓存
no-store:直接禁止游览器缓存数据
public, private<br>
强缓存就是给资源设置个过期时间,客户端每次请求资源时都会看是否过期;<br>只有在过期才会去询问服务器
协商缓存
是由服务器确定缓存资源是否可用<br>需要客户端和服务器两端进行交互的。
Last-Modified<br>If-Modified-Since
If-Modified-Since<br>If-None-Match<br>请求首部字段
当浏览器再次请求该资源时,请求头中会包含If-Modify-Since:xxx<br>该值为之前返回的Last-Modify。<br>服务器收到If-Modify-Since后,根据资源的最后修改时间判断是否命中缓存。<br>如果命中缓存,则返回304(从缓存中读取),<br>并且不会返回资源内容,并且不会返回Last-Modify。
<br>
Etag和If-None-Match<br>
Etag响应首部字段
Etag资源的一个唯一标识,资源变化都会导致ETag变化
服务器根据浏览器上发送的If-None-Match值(Etag)来判断是否资源是否改变。
If-None-Match:值为之前的Etag值<br>表明资源已经更新,可响应请求<br>
服务器渲染<br>
SSR:Server Side Render简称
页面上的内容是通过服务端渲染生成的,<br>浏览器直接显示服务端返回的html就可以了
浏览器端渲染 (CSR):Client Side Render,页面上的内容是我们加载的js文件渲染出来的,<br>js文件运行在浏览器上面,服务端只返回一个html模板
组件或页面通过服务器生成html字符串,再发送到浏览器,
https://zhuanlan.zhihu.com/p/90746589
前端路由
相关网络过程<br>
二维码扫描登录<br>
https://blog.csdn.net/ALakers/article/details/108445538
https://www.cnblogs.com/jamaler/
首次登录<br>
二维码其实是字符串的图片表现形式<br><br>基于token的认证机制<br>1、首次登录:客户端向服务器传送【用户信息+密码+设备信息】进行认证;<br>2、服务端认证通过后,通过相关算法(hash)生成【token与设备信息进行对应】,存储在服务端并将token回传到客户端;<br>3、客户端每次访问API时,需要携带【token+设备信息】作为验证信息;【服务端进行解码认证】<br>4、服务端【验证token+设备信息】是否对应,验证通过后,返回API响应,验证不通过,拒绝服务;<br>特别注意:token是某个客户端私有的,即使有token,没有对应的设备信息,也是验证不通过的<br>
<br>
验证二维码<br>
二维码登录原理主要基于<font color="#c41230">token的认证机制+二维码状态变化</font>实现<br>1、二维码状态有三种:<font color="#c41230">待扫描、已扫描待确认、已确认;</font><br>2、待扫描:PC端携带设备信息向服务端发送请求,服务端生成二维码ID与设备信息进行绑定,将二维码ID返回给PC端,PC端已二维码的形式显示二维码;<br>3、PC端通过轮询的方式向服务端查询二维码的状态是否发生变化;<br>4、移动端扫描PC端二维码,获取到二维码ID,移动端带二维码ID+移动端身份信息(token)发送给服务端,服务端验证身份信息通过后,将二维码ID与身份信息绑定,并生成临时token返回给移动端,二维码状态变为已扫描待确认;<br>5、移动端确认登录,并携带临时token请求服务端,服务端验证临时token通过后,<br>改变二维码状态为已确认并生成PC-token,PC端通过轮询知二维码状态为已确状态
<br>
token,cookies,session
https://www.cnblogs.com/moyand/p/9047978.html
为什么token安全
https://muyiy.cn/question/browser/28.html
CSRF:跨站请求攻击
cookie:用户点击了链接,cookie未失效,导致发起请求后,<font color="#c41230"><br>浏览器自动携带cookie</font>,后端以为是用户正常操作,于是进行扣款操作。
token:由于浏览器不会自动带上token<br>需要开发者手动将token放在header中带过去
5层协议
应用层
直接为用户的应用进程提供服务<br>
报文
HTTP,SMTP,FTP,DNS,TELNET(远程登录),RPC<br>
远程过程调用
DNS
域名系统
将域名与IP映射到一个分布式数据库:方便访问
表示层
包括数据压缩、数据加密、数据描述<br>
数据描述:解决计算机内部存储格式问题<br>
会话层
提供数据交换的定界与同步功能<br>
建立检查点与恢复方案<br>
传输层
负责向两个主机中进程(端口)之间的通信提供服务<br>
复用
多个进程使用一个IO资源发送消息时:去往下层<br>
分用
多个进程使用一个IO资源接收消息:去往上层
TCP
面向连接的、可靠的协议
文件传输,邮件传输<br>
传输形式:字节流
首部字节:20-60
特点<br>
数据传递时:有确认、窗口、重传、拥塞控制机制
数据传完后:还会断开连接用来节约系统资源
增加了许多开销,首部增大
UDP
无连接的,仅最大力(不可靠)
QQ视频,DNS
C:不需要先建立连接<br>S:不需要给出任何确认
传输形式:数据报文段<br>
首部字节:8
传输效率快
多对多
网络层
将数据报从源主机移动到目的主机,需要为数据报<font color="#c41230">选择路径</font><br>选择合适的<font color="#c41230">网间路由与交换节点</font>,确保数据<b>快速到达</b>
IP
IP数据报
Internet Protocol
20字节
ICMP
封装为分组
路由器
数据链路层
负责将<font color="#c41230">帧</font>从一个节点移动到下一节点
数据报->帧
以太网<br>
WiFi
控制信息
差错控制
<br>
ARP:地址解析协议
将IP解析成Mac地址
物理层
传递从数据链路层接收的位并把这些位(byte)转化为<font color="#c41230">电磁信号</font>,<br>然后再转交给<font color="#c41230">传输介质</font>
byte-比特<br>
HTTP
超文本传输协议<br>
图片,视频,HTML->超链接
HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据 的「约定和规范」。
状态码
301是永久重定向,而302是临时重定向。
301比较常用的场景是使用域名跳转。<br>302用来做临时跳转 比如未登陆的用户访问用户中心重定向到登录页面。
常见字段<br>
Connection
Keep-Alive
客户端要求服务器使用 TCP 持久连接
HTTP长连接,短连接
1.0中默认使用短连接。客户端和服务器每进行一次HTTP操作,建立一次连接,任务结束就中断连接
1.1起,默认使用长连接,用以保持连接特性<br>传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接
请求头
Host 字段
用来指定服务器的域名--www.A.com
Accept
接受哪些数据格式。
响应头
Content-Length
服务器在返回数据时,表明本次回应的数据长度。
Content-Type
服务器回应时,告诉客户端本次数据是什么格式。
GET/POST
GET
从服务器<font color="#c41230">获取资源</font>
静态的文本、页面、图片视频
1. 浏览器在回退时,get 不会重新请求,但是post会重新请求。【重要】<br>2. get请求会被浏览器主动缓存,而post不会。【重要】<br>3. get请求的参数,会报保留在浏览器的历史记录里,而post不会。做业务时要注意。为了防止CSRF攻击,很多公司把get统一改成了post。<br>4. get请求在url中传递的参数有大小限制,基本是2kb`,不同的浏览器略有不同。而post没有注意。<br>5. get的参数是直接暴露在url上的,相对不安全。而post是放在请求体中的。
https://www.cnblogs.com/logsharing/p/8448446.html
请求参数包含在URL中
不安全
发送数据小
浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
POST
向 URI 指定的资源<font color="#c41230">提交数据</font>
数据就放在报文的 body 里
token:header->Authorization
POST产生两个TCP数据
浏览器先发送header,服务器响应100 continue,<br>浏览器再发送data,服务器响应200 ok(返回数据)。
与浏览器有关
安全和幂等
安全」是指请求方法不会「破坏」服务器上的资源。
幂等」,意思是多次执行相同的操作,结果都是「相同」的。
GET 方法就是安全且幂等的,因为它是「只读」操作
POST 因为是「新增或提交数据」的操作,不安全,不幂等
head
类似于get请求,只不过返回的响应中没有具体的内容,用户获取报头
查看服务器的性能,服务器支持的请求方式
特性
报文格式就是 header + body
缺点
分别是「无状态、明文传输、不安全」。
无状态<br>
Cookie 技术。
客户端请求服务器的时候,带上「小贴纸」,服务器就能认得了了
明文传输
对称加密
非对称加密/公钥私钥<br>
安全
HTTPS 也就是在 HTTP 与 TCP 层之间增加了 SSL/TLS 安全传输层,
HTTP 协议是基于 TCP/IP
http1.1
长连接-持久连接
只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。
只进行一次三次握手-减轻了服务器端的负载。
但是一次只能一个请求
管道网络传输
第一个请求发出去了,不必等其回来,可以发第二个请求出去
减少整体的响应时间
队头堵塞
服务器顺序响应
服务器只有处理完一个回应,才会进行下一个回应。<br>要是前面的回应特别慢,后面就会有许多请求排队等着
Http2.0
头部压缩<br>
同时发出多个请求,他们的头是一样的或是相似的,会消除重复的部分。<br>
全面采用了二进制格式
数据流
还可以指定数据流的优先级
帧
多路复用
多个请求复用一个TCP连接
解决队头堵塞
一个连接中TCP,客户端和浏览器都可以同时发送多个请求或回应,<br>而且不用按照顺序一一对应
多路复用归功于,帧(frame)和流(stream),二进制。<br>帧代表着最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。<br>就是在一个 TCP 连接中可以存在多条流。
服务器主动推送消息
https://muyiy.cn/question/network/15.html
Http3.0
HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP(QUIC)
基于 UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输。
HTTPS<br>
Https是具有安全性的SSL加密传输协议,即<font color="#c41230">SSL+Http协议构建的可进行加密传输、身份认证的网络协</font>议,比Http协议安全。<br>其作用主要是为浏览器和服务器之间的通信加密,确保数据传输的安全。<br>
SSL协议需要SSL证书,而SSL证书是由受信任的数字证书颁发机构CA在验证服务器身份后颁发。
需要向 CA(证书权威机构)申请数字证书
服务器公钥放在数字证书中
SSL
Secure Sockets Layer 安全套接字协议
加入了 SSL/TLS 安全协议,使得报文能够加密传输。
四次握手
1. C->S: cilent hello的数据包,包含协议版本,加密算法等<br>2. S->C: Server Hello,加密算法,证书:含有服务端的公钥、CA数字签名等信息<br>3. C->S端验证信息,正确则发送给服务端预约密钥,然后用服务端返回的公钥进行加密传输<br>4. S->C:告知客户端,会使用刚刚协商的密钥来加密信息
TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
信息加密
混合加密
通信之前进行非对称加密
公钥对内容进行加密,<br>然后只有私钥才能解密
由于非对称加密的性能低,因此用它来先协商对称加密的密钥即可,<br>后续真正通信的内容还是用对称加密的手段,提高整体的性能。
解决密钥配送问题
通信之后进行对称加密
加解密密钥相同
校验机制
摘要算法
身份证书
CA:公钥
确实是和正确的人通信
数字证书:公钥解密
https://developers.weixin.qq.com/community/develop/article/doc/000046a5fdc7802a15f7508b556413
HTTPS 的端口号是 443。
TCP
三次握手-四次挥手
为了建立可靠的通信信道<br>
保证发送与接受都是正常的
双发收发功能都正常
自己发送、接收正常<br>对方发送、接收正常
为什么3次<br>
TCP 连接
用于<font color="#c41230">保证可靠性和流量控制维护的状态信息</font><br>Socket、序列号和窗口大小称为连接。
RFC:互联网标准
1. 才可以阻止重复历史连接的初始化(主要原因)<br> 2. 才可以同步(确认保证)双方的初始序列号<br> 3. 才可以避免资源浪费<br>
1. 网络拥堵情况下:<br>一个「旧 SYN 报文」可能比<br>「最新的 SYN 」 报文早到达了服务端;
如果是历史连接(序列号过期或超时),则第三次握手发送的报文是 RST 报文,以此中止历史 连接;<br>如果不是历史连接,则第三次发送的报文是 ACK 报文,通信双方就会成功建立连接;
2. 序列号是可靠传输的关键
保证数据包不重复、不丢弃和按序传输。
去除重复的数据;<br> 按序接收;<br> 标识对方已经收到;
3. 如果客户端重复发送多次 SYN 报文,【ack堵塞】<br>
没有第三次握手,<br>服务器不清楚客户端是否收到了自己发送的建立连接的ACK 确认信号<br>那么服务器在收到请求后就会建立多个冗余的无效链接,<br>造成不必要的资源浪费。
「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列 号;<br>「四次握手」:三次握手就已经理论上最少可靠连接建立无需。
握手(连接)
1. 客户端发送带有SYN标志(序号同步位)的数据包到服务端<br>
客户端发起的 TCP 第一次握手 SYN 包,在超时时间内没收 到服务端的 ACK,<br>就会在超时重传 SYN 数据包,每次超时重传的 RTO 是翻倍上涨的(1s+2s+4s+8s+32=63s),<br>直到 SYN 包的 重传次数到达 <font color="#c41230">tcp_syn_retries=5 </font>值后,客户端不再发送 SYN 包。
2. 服务端发送带用SYN/ACK的标志的数据包到客户端<br>
SYN:建立连接,确认通信
ACK:收到数据报,是你发的
S-处于SYN-ReCV状态<br>
内核建立半连接队列<br>
SYN攻击之
netstat -s
查看丢掉的 TCP 连接的个数
当第二次握手的 SYN、ACK 丢包时,客户端会超时重发 SYN 包,<br>服务端也会 超时重传 SYN、ACK 包。
tcp_synack_retries = 5<br>进行重传<br>
3. 客户端发送带有ACK标志的数据包到服务端
确认建立连接
可以携带数据
如果第三次握手的 ACK,服务端无法收到,<br>则服务端就会短暂处于 SYN_RECV 状态,而客户端会处于 ESTABLISHED 状态。
服务端一直收不到 TCP 第三次握手的 ACK,则会一直重传 SYN、ACK 包,<br>直到重传次数超过 tcp_synack_retries 值(默认值 5 次)后,服务端就会断开 TCP 连接。<br>
客户端
传送数据
一直重传该数据包,直到重传次数超过 tcp_retries2 值(默认值 15 次)后,<br>客户端就会断开 TCP 连接。
没传送数据
保活机制
一直处于 ESTABLISHED 状态,然后经过 2 小时 11 分 15 秒<br>才可以 发现一个「死亡」连接,于是客户端连接就会断开连接。<br>
内核连接队列<br>
半连接队列-<br>SYN 队列
第一 >> 二握手:服务端收到客户端发起的 SYN 请求后,<br>内核会把该连接存储到半连接队列,并向客户端响应 SYN+ACK
当半连接队列溢出后,<br>服务端就无法再建立新的连接。
开启 tcp_syncookies 功能解决
全连接队列<br>Accept 队列
第三次握手的 ACK 后,内核会把连接从半连接队列移除,<br>然后创建新的完全的连接,并将其添加到 accept 队列,<br>等待进程调用 accept 函数时把连接取 出来。
如果进程不能及时地调用 accept 函数,就会造成 accept 队列溢出,<br>最终导致建立好的 新的TCP 连接被丢弃(默认)
还可以选择向客户端发送 RST 复位报文
绕过三次握手
TCP Fast Open
第一次连接时还是三次握手,<br>但是TCP可选里多了Fast Open 选项带cookies
客户端缓存cookies信息,下一次请求时带上cookies与数据<br>如果服务端验证cookies成功,则对数据交给进程进行处理<br>
减少了握手带来的 1 个 RTT 的时间<br>消耗。
挥手(断开)
1. 客户端发送FIN关闭C->S的连接(半关闭状态)<br>
客户端不再发送数据了但是还能接收数 据。
超时会重发其FIN
2. 服务端发送ACK表示收到了<br>
服务端可能还有数据需要处理 和发送
3. 服务端发送FIN关闭S->C的连接(半关闭状态)
超时会重发其FIN
tcp_orphan_retries
4. 客户端发送ACK确认关闭连接(完全关闭TCOP连接)<br>
客户端在经过 2MSL 一段时间后,自动进入关闭状态
客户端接收到 FIN 后发送 ACK 开始计时的
打电话:A->B<br>A:我说完了;<br>B:好的;<br>B:继续说....我说完了;<br>A:好的;挂电话。
time-wait
主动关闭连接的,才有 TIME_WAIT 状态。<br>
调用close()发起主动关闭的一方,在发送最后一个ACK之后会进入time_wait的状态
该发送方会保持2MSL时间之后才会回到初始状态
这个TCP连接在2MSL连接等待期间,定义这个连接的四元组不能被使用。<br>(客户端IP地址和端口,服务端IP地址和端口号)
MSL <br>
最大报文段生存时间,它是任何报文在网络上存在的最长时间,
超过这个时间报文将被丢弃。
Linux 系统里 2MSL 默认是 60 秒
保证双方的连接都可以正常的关闭。
TTL
IP 头中有一个 TTL字段,是 IP 数 据报可以经过的最大路由数
路由器此值就减 1
为什么需要 TIME_WAIT 状态?
防止具有相同「四元组」的「旧」数据包被收到;<br>为使旧的数据包在网络因过期而消失
经过 2MSL 这个时间,足以让两个方向上的数据包都被丢弃,<br>使得原来连接的数据包在网络中都自然消失,<br>再出现的数据包一定都是新建立连接所产生的。<br>
保证「被动关闭连接」的一方能被正确的关闭,<br>即保证最后的 ACK 能让被动关闭方接收,从而帮 助其正常关闭;
如果未关闭,则一直处于LASE_ACK 状态
当客户端发起建立连接的 SYN 请求报文后,<br>服务端会发送 RST 报文给客户端,连接建立的过程就会被终止。
过多影响<br>
第一是内存资源占用;<br>
服务端线程占用
第二是对端口资源的占用,一个 TCP 连接至少消耗一个本地端口;
则会导致无法创建新连接【客户端】
https://blog.csdn.net/huangyimo/article/details/81505558
保活机制
已经建立了连接,但是某一段突然出现故障
每隔一 个时间间隔,发送一个探测报文,<br>如果连续几个探测报文【保活探测次数】都没有得到响 应,<br>则认为当前的 TCP 连接已经死亡
程序崩溃并重启
客户端会产生一个 RST 报文
断开重置连接
TCP参数<br>
https://blog.csdn.net/zhangxinrun/article/details/7621028
包头格式<br>
源、目的端口<br>
确认数据发给哪个应用<br>
序列号-32位
解决包乱序
操作系统随机初始化<br>
ISN = M + F (localhost, localport, remotehost, remoteport),F是hash算法
M=基于时钟的,每 4 毫秒 + 1
确认序号-32位
确认发出去对方能收到
序列号+1
解决不丢包问题
状态位
置1
SYN攻击
攻击者短时间伪造不同 IP 地址的 SYN 报文
占满服务端的 SYN 接收队列(半连接队列),<br>而ack队列为空<br>使得 服务器不能为正常用户服务。
解决
net.ipv4.tcp_syncookies = 1
当「 SYN 队列」满之后,后续服务器收到 SYN 包,不进入「 SYN 队列」;<br>计算出一个 cookie 值,再以 SYN + ACK 中的「序列号」返回客户端,
窗口大小
接收端告诉发送端自己还有多少缓冲区可以接收数据
MTU(最大传输单元) :一个网络包的最大长度,以太网中一般为 1500 字节。<br>MSS(最大报文段长度) :除去 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度。
数据按MSS拆分<br>
所有「分片都具有 TCP 头部」
序列号
TCP 分片丢失后,进行重发时也是以 MSS 为单位,<br>不用重传所有的分片,大大增加了重传的效率。
TCP MSS分片如果丢失了一片,<br>发送方没收到对方ACK应答,触发超时重传机制<br>
如果按IP分片<br>
以MTU为单位
当一个 IP 分片丢失,整个 IP 报文的所有分片都得重传。
IP 层本身没有超时重传机制,它由传输层的 TCP 来负责超时和重传。
每个被拆分的数据加上 TCP 头信息,然后交给 IP 模块来发送数据。
最大TCP连接数
IP数*端口数=2^32 * 2^16 = 2^48<br>
特点<br>
数据传递时:有确认、窗口、重传、拥塞控制机制
无差错、不丢失、不重复、按需到达
以MSS进行分片
数据传完后:还会断开连接用来节约系统资源
增加了许多开销,首部增大
TCP 的连接状态查看: netstat -napt<br>
为什么TCP
IP 层是「不可靠」的,不保证网络包的交付、<br>不保证网络包的<font color="#c41230">按序交付</font>、也不保证网络包中的<font color="#c41230">数据的完整性</font>。
确保网络包是无损坏、无间隔、非冗余和按序的。<br>
UDP<br>
头部仅8字节<br>
固定
不需首部长度字段
支持一对一、一对多、多对多的交互通信
尽最大努力交付,不保证可靠交付数据
如果中途丢了一个分片,则就需要重传所有的数据包
以MTU在IP层进行分片
应用<br>
视频、音频,广播应用
DNS 、 SNMP
保证可靠传输
给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
接收端会丢弃重复的数据。
校验和
首部和数据的检验和
检测数据在传输过程中的任何变化
如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
重传机制
序列号与确认应答。
超时重传<br>
设定一个定时器,当超过指定的时间后<br>未收到ACK 确认应答报文,则重传
数据包丢失<br>确认应答丢失
每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为<font color="#c41230">先前值的两倍</font>。<br>两次超时,就说 明网络环境差,不宜频繁反复发送。
RTT
往返时延
包的往返时间
RTO
重传超时时间
Retransmission TimeOut
应该略大于报文往返 RTT 的值
动态变化的值。
快速重传<br>
收到三个相同的 ACK 报文时,<br>会在定时器过期之前,重传丢失的报文段。
重复确认
SACK
Selective Acknowledgment 选择性确认
TCP 头部「选项」字段里加一个 SACK字段
表明收到了哪些序列段数据包
开启只需要重传丢失的数据包。<br>如果不启用 SACK,就必 须重传丢失包之后的每个数据包。
D-SACK
使用了 SACK 来告诉「发送方」有哪些数据被重复接收了。
网络延迟
流量控制
滑动窗口
每发送一个数据,都要进行一次确认应答<br>效率比较低的。
窗口大小<br>
指无需等待确认应答,而可以继续发送数据的最大 值。
假设窗口大小为 3 个 TCP 段,<br>那么发送方就可以「连续发送」 3 个 TCP 段
实现是操作系统开辟的一个缓存空间(内存缓冲区)
累计确认
中途若有 ACK 丢失,可以通过「下一个确认应答进行确认」
TCP头部字段
接收端告诉发送端自己还有多少缓冲区可以接收数据
由接收方的窗口大小来决定的
发送方窗口
三个指针来跟踪在四个传输类别
四类
已发送并收到 ACK确认的
已发送但未收到 ACK确认的
未发送但总大小在接收方处理范围内(可用窗口)
未发送但总大小超过接收方处理范围
三指针
snd.win:发送窗口大小
snd.una:指向为确认第一个序列号
snd.nxt:指向未发送但可发送范围
可用窗口为0时,<br>发送窗口探测报文
swnd = min(拥塞窗口,接收窗口)。<br>
可用窗口大小 = SND.WND -(SND.NXT - SND.UNA)<br>(窗口大小-(未发送但在可发送范围内第一个 - 已发送待ack第一个))<br>
发送窗口决定了一口气能发多少字节(较大)<br>而 MSS 决定了这些字节要分多少包才能发完。
接收方窗口
两个指针三个接收部分
已接受已确认,未接收但可接收,不能接收
RCV.WND:接收窗口的大小
RCV.NXT
指向期望从发送方发送来的下一个数据字节的序列号
通过 ACK 报文通知 给对方
0窗口通知
当发送 方接收到零窗口通知时,就会停止发送数据。<br>
接着计时,发送方会定时发送窗口大小探测报文,<br>以便及时知道接收方窗口大小的变化。
超时时间会翻倍递增
<font color="#c41230">滑动窗口</font>实现流量控制
TCP 规定是不允许同时减少缓存又收缩窗口的,<br>采用先收缩窗口,过段时 间再减少缓存,这样就可以避免了丢包情况。<br>
先减少缓存,再收缩窗口,就会出现丢包的现象。
接收方应用程序来不及处理发送方的数据,<br>能提示发送方降低发送的速率,防止包丢失
糊涂窗口综合症
接收方腾出几个字节并告诉发送方,<br>而发送方会发送这几个字节
效率低下,大的开销
TCP + IP 头有 40 个字节
延迟确认与 <br>Nagle 算法
TCP 报文中都会有 20 个字节的头部<br>如果传输数据较小(只有几个字节),会很没效率<br>
Nagle 算法<br>发送方<br>
避免过多的小数据报文发送,这可提高传输效率。
策略<br>
没有已发送未确认报文时,立刻发送数据。
即未收到第一个报文的确认前,<br>是不会发送后续的数据;<br>
存在未确认报文时,直到「数据长度(窗口) >= MSS 大小」时,<br>再发送数 据。
否则:囤积数据
一定会有一个小报文,也就是在最开始的时候
TCP 延迟确认
尽量等待与响应数据一起发送<br>否则延迟一段时间<br>
第二个数据报文又到达了,<br>立刻发送 ACK
同时使用会造成额外的时延,都在等<br>建议只开一方<br>
网络并未堵塞
流量控制是避免「发送方」的数据填满「接收方」的<font color="#c41230">缓存区</font>,<br>但是并不知道网络的中发生了什么。
拥塞控制
当网络拥塞时,减少数据的发送。<br>避免「发送方」的数据填满整个网络。
在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,<br>这时 TCP 就会重传 数据,但是一重传就会导致网络的负担更重
发生了超时重传,就会认为网络 出现了拥塞<br>即规定时间内没收到ACK<br>
<font color="#c41230">拥塞窗口</font> cwnd
发送方维护的一个的状态变量
发生堵塞就减少<br>
发送窗口的值是swnd = min(cwnd, rwnd)
四个算法
慢启动<br> 拥塞避免<br> 拥塞发生<br> 快速恢复
建立连接完成后,首先是有个慢启动的过程
当发送方每收到一个 ACK,(1-2-4-8)<br>每个拥塞窗口 cwnd 的大小就会加 1(指数增长)
发包的个数是指数性的增长。
cwnd 「超过」慢启动门限 ssthresh状态变量。<br> 就会进入拥塞避免算法。(slow start threshold)
每当收到一个 ACK 时,cwnd 增加 1/cwnd。
指数增长变成了线性增长
当触发了重传机制,也就进入了「拥塞发生算法」。<br>
超时重传
快速重传
cwnd=cwnd/2<br>ssthresh=cwnd<br>
快速重传之后进入快速恢复<br>
拥塞窗口 cwnd = ssthresh + 3
重传丢失的数据包
如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值
再次进入拥塞避免状态;
https://blog.csdn.net/ligupeng7929/article/details/79597423
ARQ协议
Automatic Repeat-reQuest:自动重传请求
停止等待
出现差错情况(超时重传):
确认丢失
A->B,B-A丢失,A->B,<br>B再次收到该消息:1. 丢弃重复的消息 2. 向A发送确认消息。
确认迟到
收到两份确认消息,丢弃<br>
连续ARQ协议
维持一个<font color="#c41230">发送窗口</font>,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。
累计确认
提高信道利用率
每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
IP
IP与Mac<br>
IP 的作用是主机之间通信用的
MAC 的作用则是实现「直连」<br>的两个设备之间通信
IPv4
32 位正整数来表示
2^32个
分类地址。<br>
A,B,C,D,E
A(0-7-24)
B(10-14-16)
D 类常被用于多播,E 类是预留的分类,
多播用于将包发送给特定组内的所有主机。
穿透路由的多播
224.0.0.0 ~ 239.255.255.255
缺点
太多或太少分配不均
A、B、C 类主要分为两个部分,<br>分别是网络号和主机号
最大主机个数,2^x-2
主机号全为 0 指定某个网络<br>主机号全为 1 指定某个网络下的所有主机,用于广播 <br>
广播地址用于在同一个链路中相互连接的主机之间发送数据包。"班长"
本地广播
被路由器屏蔽
直接广播<br>
解决
CIDR无分类地址
a.b.c.d/x ,其中 /x 表示前 x 位属于网络号
子网掩码
掩码的意思就是掩盖掉主机号,剩余的就是网 络号。
将子网掩码和 IP 地址按位计算 AND,就可得到网络号。
两台计算机要通讯,首先要判断是否处于同一个广播域内,即网络地址是否相同。<br>如果网络地址相 同,表明接受方在本网络上,那么可以把数据包直接发送到目标主机。
路由器寻址工作中,也就是通过这样的方式来找到对应的网络号的
子网划分
如果两个(IP&子网)相同,则为同一子网下
ip 地址:网络地址+(子网网络地址+子网主机地址)
网络号+主机号
网络地址这一部分是用于进行路由控制。
主机和路由器上都会有各自的路由器控制表。<br>【网络号,下一跳】<br>
找相同网络号-->下一个路由器
最长匹配
如果路由控制表中存在多条相同网络地址 的记录,<br>就选择相同位数最多的网络地址
默认匹配【(0,0,0,0),下一跳】
没有找到与目标地址相同的网络地址,包被转发到默认路由<br>
最终经过交换机把 IP 数据包转发到了目标主机
主机号
环路地址
localhost
特殊的 IP 地址 127.0.0.1 作为环回地址
使用这个 IP 或主机名时,数据包不会流向网络。<br>
分片与重组
分片
最大传输单元 MTU<br>
以太网的 MTU 是<br>1500 字节
当 IP 数据包大小大于 MTU 时, IP 数据包就会被分片。
(MSS)Maximum Segment Size
分片传输中,一旦某个分片丢失,则会造成整个 IP 数据报作废,<br>所以 TCP 引入了 MSS 也就是在 TCP 层进行分片不由 IP 层分片
TCP超时重传
对于 UDP 尽量不要发送一个大于 MTU 的数据报文。
重组
IP 数据报在被重组的时候,只能由目标主机进行,路由器是不会进行重组的。
IPv6
基本概念<br>
128 位的
IPv4 和 IPv6 不能相互兼容
每 16 位作为一组,每组用冒号 「:」 隔开。
安全性和扩展性
可自动配置
不用 DHCP 服务器也可以实现自动分配IP地址
头部
固定 40 字节
去掉了包头校验和
提高了传输的性能
改进<br>
取消了首部校验和字段。
取消了分片/重新组装相关字段。
提高了路由器转发的速度
取消选项字段。
IP头<br>
源、目的IP
route -n 命令查看当前系统的路由表。
协议号
TCP-06(16进制)
TTL
生存周期,它的值随着每经过一次路由器就会减<br>1,直到减到 0 时该 IP 包会被丢弃。
为了在路由控制遇到问题发生循环状况时,避免 IP 包无休止地在网络上被转发。
ICMP
超时消息— 类型 11
发送给端主机
20字节
相关协议<br>
DNS
浏览器首先看一下自己的缓存里有没有,<br>
如果没有就向操作系统的缓存要,
检查本机域名解析文件 hosts<br>
就会 DNS 服务器进行查询,查询的过程如下
发送DNS请求
- 本地 DNS 服务器:缓存里的表格 <br>否则:根域名服务器,不直接用于域名解析,但能指明一条道路。
ICMP
互联网控制报文协议
功能
确认IP包是否成功到达目标地址
报告发送过程中 IP 包被废弃的原因<br>
目标不可达<br>
通知消息会使用 IP 进行发送 <br>
ICMP 报文是封装在 IP 包里面
工作在网络层,是 IP 协议的助手。
改善网络设置等
重定向消息— 类型 5
端主机使用了「不是最优」的路径发送数据
包头类型
查询报文类型:诊断的查询信息
回送消息
响应0
请求8
主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消<br>息,<font color="#f15a23"> ping </font>命令就是利用这个消息实现的。
差错报文类型:通知出错原因<br>
目标不可达消息 —— 类型为 3
原点抑制消息— 类型 4
缓解网络堵塞<br>
重定向消息— 类型 5
端主机使用了「不是最优」的路径发送数据
超时消息— 类型 11
TTL
https://blog.csdn.net/zhenyi2000/article/details/79795095
ping
使用了 ICMP 里面的 回送请求(T= 8 ) 和 回送响应 (类型为 0)。
在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达
traceroute(tracert)
利用 ICMP 差错报文类型
作用
故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器IP。
利用 IP 包的生存期限 从 1 开始按照顺序递增的同时发送 UDP 包,<br>强制接收 ICMP 超时消息(类型)的一种方法。
TTL每遇到-1,=0丢弃包
比如,将 TTL 设置 为 1 ,则遇到第一个路由器,就牺牲了
返回ICMP 差错报文网络包,类型 是时间超时。
当然有的路由器根本就不会返回这个 ICMP,所以不一定能获得IP
知道UDP到达目的
端口不可达<br>
发送 UDP 包时,会填入一个不可能的端口号值作为 UDP 目标端口号(大于 3000 )。<br>当目的主机,收到 UDP 包后,会返回 ICMP 差错报文消息
traceroute 192.168.1.100
故意设置不分片,从而确定路径的 MTU(最大传输单元)
控制发送的包大小
将 IP 包首部的分片禁止标志位设置为 1。根据这个标志位,<br>途中的路由器不会对大数据包进行分片,而是将包丢弃。然后返回ICMP包
ICMP 的不可达消息将数据链路上 MTU 的值一起给发送主机,不可达消息的类型为<br>「需要进行分片但设置了不分片位」。
ARP
ARP 协议会在以太网中以<font color="#f15a23">广播</font>的形式
ARP 请求与 ARP 响应
查询后放在ARP缓存里
arp -a
RARP
已知 MAC 地址求 IP 地址
DHCP
动态获取 IP 地址
动态主机配置协议
DHCP 客户端进程监听的是 68 端口号,<br>DHCP 服务端进程监听的是 67 端口号。
步骤
使用的 <font color="#c41230">UDP 广播通信发送</font>DCHP IP数据包获取IP<br>
<br>
NAT
网络地址转换 NAT 的方法,再次缓解了 IPv4 地址耗尽的问题。<br>
把私有 IP 地址转换成公有 IP 地 址。
IP 地址 + 端口号一起进行转换。
路由器的转换表
0 条评论
下一页