IP
回顾
UDP
用户数据报协议
无连接,不可靠,面小数据包,全双工
-
UDP是无连接的。
发送数据之前不需要建立连接; -
UDP 是使用尽最大努力交付,即不保证可靠传输。
-
UDP是面向报文的。
UDP对应用层交下来的报文,既不合并,也不拆分,保留这些报文的边界。也就是说应用层交给UDP 多长的报文,UDP 就照样发送,一次发送一个报文。UDP一次交付一个完整的报文,因此,应用程序必须选择合适大小的报文(太长,IP层可能进行分层,会导致IP 层效率降低;报文太短,IP数据报的首部相对长度太大,也会降低IP层效率)。 -
UDP没有拥塞控制。
网络出现拥塞的时候不会使源主机的发送效率降低。 -
UDP支持一对一,一对多,多对一,多对多的交互通信。
-
UDP的首部开销小
只有8个字节。 -
改进
UDP 的不可靠传输可以进行适当的改进,以减少数据的丢失。应用进程本身可以在不影响应用的实时性的前提下,增加一些提高可靠性的措施,如采用前向纠错或重传以丢失的报文。
(IP数据报的检验和 只检验IP数据报的首部,单UPD的检验和是把首部和数据部分一起都检验 )
- 面试问题
- UDP本身是无连接,不可靠,面向数据报的协议,如果要基于传输层UDP协议,来实现一个可靠传输,应该如何设计?
- UDP大小是受限的,如果要基于传输层UDP协议,传输超过64K的数据,应该如何设计?
答:对于UDP协议可以引入序列号,保证数据顺序;引入确认应答,确保对端收到了数据;引入超时重传,如果隔一段时间没有应答,就重发数据。 - 如何基于UDP实现分包组包,解决方案就是在应用层设计(10位,那些包是相同的)标识,(13位 顺序)片偏移和()结束标记(是否为还有分片)(较长的分组分片后,某片在原片的相当于位置。)
TCP
传输控制协议
- TCP 是有连接的。
需要建立连接和释放连接 - TCP连接只能是点对点的
- TCP提供可靠交付
无差错,不丢失、不重复,并且按序到达。 - TCP提供全双工通信
- TCP是面向字节流的
TCP把应用程序交下来的数据仅仅看成一连串的无结构的字节流。接收方应用程序收到的字节流和发送方应用程序发出的字节流完全一致。
要保证可靠性,同时又尽可能的提高性能
可靠性(安全机制):
-
校验和
-
序列号(按序到达)
-
确认应答
TCP将每个字节的数据进行编号,也就是序列号;每一个ACK都带有对应的确认序列号(意思是高速发送者,我已经收到了那些数据,下一次从哪里发) -
超时重传
可能由于网络阻塞等原因,发送方的数据没有到达或者接收方的确认应答数据报没有接受到。
接受方有接受缓冲区,可以识别出重复的包,把重复的丢弃。
会动态计算最大超时时间 -
连接管理
TCP经过三次握手建立连接,四次挥手断开连接。
三次握手的作用
1.相当于“投石问路”,检查一下当前这个网络情况是否满足可靠传输的基本条件。检测通信双方的发送能力和接收能力是否都正常。
2.让双方能够协商一些必要的信息
TCP 如果四次握手,会认为可以,但是没有必要,分开传输,效率会降低,不如和并一起好;二次握手,不行,此时只能保证发送方(客户端)的发送能力和接受能力正常且完整,但是服务器端是残缺的,服务器段不知道自己的发送能力是否ok 也不清楚接收方的接受能力是否ok。
三次交互,相当于给服务端一个定心丸。
四次挥手,是释放连接。建立好连接之后,操作系统内核中,会有使用一定的数据结构来保存连接相关的信息(“五元组”等)
由于三次握手的ACK 和SYN 是操作系统内核处理的是可以合并的;
四次挥手的ACK是操作系统内核处理的,FIN 是用户代码负责的(需要调用socket 的close方法,才会触发)时机不同~;捎带应答会导致两个包合并(小概率事件) -
流量控制
衡量接收方的处理速度,根据接收方的缓冲区的剩余大小。(如果剩余空间比较大,认为接收方的处理能力比较强,可以让发送方法快点)双方更好的协调和适配;
可以理解为生产者消费模型;
窗口越大(一次传输的数据量),传输速率越高。
对方发送的ack 及窗口为0 (接受段数据缓冲区满的状态下)后发送方 过了重发超时的时间以后,若没有收到窗口的更新的饿通知,发送端会发送一个窗口探测的包。
TCP 首部选项中包含窗口扩大因子M,相当于窗口字段的值向左移M位 -
拥塞控制
由于双方中间的链路之间可能有很复杂的转发设备,希望发的又快有不丢包。 TCP 引入慢启动,先发少量的数据,摸清当前的网络拥塞状态。指数增长到阈值后线性增长,遇到网络阻塞,阈值会变成原来的一半,拥塞窗口回归初始的窗口大小1
最终的滑动窗口大小是拥塞窗口与流量控制窗口的最小值。
少量的丢包,我们仅仅是触发超时重传;大量的丢包,我们就认为网络拥塞;
当TCP通信开始后,网络吞吐量会逐渐上升;随着网络发生拥堵,吞吐量会立刻下降;
提高性能(效率机制):
-
滑动窗口
想办法稍等一会儿,窗口越大,网络吞吐率越高。收到第一个ACK后,滑动窗口像后移。
需要开辟发送缓冲区,记录当前还有那些数据没有应当,只有确认应答过的数据,才能从缓冲区删掉, -
快速重传
情况一,数据包已经抵达,ACK丢了,可以通过后续的ACK进行确认
情况二,数据包丢失,接受方会向发送方 反复索要 -
延时应答
在流量控制的基础上,尽量让窗口在大点。
窗口越大,网络吞吐量越大,传输效率越高,目标是在保证网络不阻塞的状态下,尽量提高传输效率。
根据
数据限制:每隔N个包就应答一次
时间限制:超过最大延迟时间就应答一次 -
捎带应答
让操作系统内核态的ACK 稍微等一会,就可能和响应报文不限接近,甚至重合,就会进行合并,只需要传输一次,效率就就提升了。 -
面向字节流 导致的粘包 问题
粘包的包 指的是应用层的数据包;
TCP协议中没有像UDP一样的报文长度,只有序号;
站在传输层的角度,TCP是一个一个报文按照序号放在缓冲区的
站在应用层,看到的只是一串连续的字节数据。就不知道从哪到哪是一个完整的数据包了
如何避免粘包?
明确两个包之间的边界
对于定长的包,保证每次都按照固定大小读取即可(协议层)
对于变长的包,可以在包头的位置,约定一个包总长度的字段,从而就知道包的结束位置。
或者对于定长的包,可以在包和包之间使用明确的分隔符(应用层协议,只要保证分隔符不和正文冲突即可)
使用UDP 应用层收到的完整的UDP报文,要么不接受,不会出现“半个”的情况。
- TCP异常情况
进程终止:进程终止会释放晚间描述符,仍然可以发送FIN 和正常关闭没有什么区别
机器重启:会关闭所有进程
机器掉电/网线断开:
接收端认为连接还在,一旦接收端有写入操作,接收端发现连接不在了,就会进行reset TCP自己内置保活定时器等待~,定期询问对方是否还在,不在就会接收方释放连接。
发送方发现接收方没有返回ACK ,会超时重传,接着会重新建立连接(三次连接),最后A放弃与B建立连接,主动释放/销毁 曾经和B的相关信息。
IP 协议
完成两方面工作
- 地址管理
- 路由选择
4位版本号: IP的版本号 只有两个取值 4和6
0100 0110 ;
四位首部长度 4位的取值范围 0-15 单位是字节 1111 15 的时候 实际表示的首部长度是60字节。(固定长度20字节);
TOS 其实只有4位是有效的,相当于切换形态,只能选择一个。最小延时,最大吞吐量,最高可靠性,最小成本。。对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。
总长度是首部和数据之和的长度。指分片后每一个分片的首部长度与该分片的数据长度总和。
IP协议自身实现了分包和组包这样的操作
保证每个包不超过64k;
对于IP数据包来说,根本不关心载荷是什么,就是单纯的进行了确认。快递小哥只知道分包裹;
标志:
MF:MF=1表示 “还有分片” MF=0表示已经是若干数据报片中的最后一个了;
DF: DF=1 “不能分片” DF=0允许分片
片偏移越小,相对位置, 就知道那些在前后。每个分片的长度一定还8字节(64位)的整数倍
生存时间: 表示一个IP 数据报 在网络上还能存多久,这里的单位是转发次数。IP数据报发送的时候,会有一个初始的TTL(常见的取值128或者64 ) 如果TTL减到0 此时收到这个包的路由器会把这个包丢弃。
有些包的IP的地址可能永远到不了,不让她占用硬件资源太多。
协议:传输层使用的哪种协议 TCP 和UDP 都有不同的取值。
检验和:只能检验 数据报的首部,不包括数据部分
IP 地址32位点分十进制,分成4个部分,每个部分一个字节
IP层下面的数据链路层协议都规定了一个数据帧的数据字段的最长长度,称为最大传送单元MTU
1. 地址管理
32为点分十进制,网络号和主机号,子网掩码,特殊的IP
地址不够用怎么办?
动态分配IP地址,NAT机制(分成内网外网,内网软干个设备公用同一个外网IP,对于一个外网IP,可以访问互联网的任意位置;NAT设备不止会把IP调整为外网IP,端口相同,也会调整,同时NAT也会记录一一映射关系),IPv6(16个字节表示地址)
路有选择就是规划路径
内网IP 可以重复(在不同的局域网中)
外网唯一~
运营商的IP (在网上查找自己的IP)
咱俩非要交流 就要同能过一个带有外网的IP 的机器,比如QQ…
子网掩码方式划分的IP地址网段划分。
历史长河上有ABCD 划分
2.路由选择
路由选择,也就是规划路径。
当两个设备之间,要找出一条通道,能够完成传输的过程。
要想找出通道的前提是:要先认识路!
RIP协议。
目的网络 距离 下一条路由器
可以从朋友哪里认识别的相似路
数据链路层
以太网,这个协议不仅仅规定了数据链路层的内容。也规定了物理层的内容。以太网,是一个横跨两层的协议。
以太网是当前应用最广泛的局域网技术;和以太网并列的还有令牌环网,无线LAN等;
以太网的MAC层的硬件地址、物理地址或MAC 地址保证每个设备都是唯一的(网卡出厂的时候就确定了)。有些网卡支持手动匹配。
不考虑NAT的情况,一个IP数据报的源IP和目的IP是固定的
CRC 是基于CRC算法的校验和(循环冗余算法)
主机A广播发送ARP 请求分组(我是IP地址1209.0.0.5,硬件地址是:,,,我想知道主机209.0.0.6的硬件地址)
主机B向A发送ARP响应分组(我是209.0.0.6,硬件地址。。。)
域名系统DNS
能够把互联网的主机名字转换为IP地址
根域名服务器:是最高层次的域名服务器,也是最重要的,所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址。但是注意压力不能很高哦。