写完信,我会在信上写好我朋友A的地址,并放到北京市邮局(给信息附加目标IP地址,并发送给路由器) 邮局会帮我把信运输到上海市当地邮局(信息会经过路由传递到目标IP局域网的路由器) 上海市当地路由器会帮我把信交给朋友A(局域网内通信)
底层物理层,负责两个机器之间通过硬件的直接通信; 数据链路层使用硬件地址在局域网中进行寻址,实现局域网通信; 网络层通过抽象IP地址实现主机之间的逻辑通信; 运输层在网络层的基础上,对数据进行拆分,实现应用进程的独立网络通信; 应用层在运输层的基础上,根据具体的需求开发形形式式的功能。
本质:提供进程通信
底层实现:socket
运输层协议
TCP会以流的形式从应用层读取数据并存放在自己的发送缓存区中,同时为这些字节标上序号 TCP会从发送方缓冲区选择适量的字节组成TCP报文,通过网络层发送给目标 目标会读取字节并存放在自己的接收方缓冲区中,并在合适的时候交付给应用层
停止等待协议
连续ARQ协议
发送方需要根据接收方的缓冲区大小,设置自己的可发送窗口大小,处于窗口内的数据表示可发送,之外的数据不可发送。 当窗口内的数据接收到确认回复时,整个窗口会往前移动,直到发送完成所有的数据
可靠传输小结
通过连续ARQ协议与发送-确认回复模式来保证每一个数据包都到达接收方 通过给字节编号的方法,来标记每一个数据是属于重传还是新的数据 通过超时重传的方式,来解决数据包在网络中丢失的问题 通过滑动窗口来实现流量控制 通过累积确认+选择确认的方法来提高确认回复与重传的效率
开始的时候,会把窗口设置一个较小的值,然后每轮变为原来的两倍。这是慢开始。 当窗口值到达ssthresh值,这个值是需要通过实时网络情况设置的一个窗口限制值,开始进入拥塞避免,每轮把窗口值提升1,慢慢试探网络的底线。 如果发生了数据超时,表示极可能发生了拥塞,然后回到慢开始,重复上面的步骤。 如果收到三个相同的确认回复,表示现在网络的情况不太好,把ssthresh的值设置为原来的一半,继续拥塞避免。这部分称为快恢复。 如果收到丢包信息,应该尽快把丢失的包重传一次,这是快重传。 当然,窗口的终上限是不能无限上涨的,他不能超过接收方的缓存区大小。
假如TCP和UDP一样只采用目标IP+目标端口号来定义socket,那么就会出现多个发送方同时发送到同一个目标socket的情况。这个时候TCP无法区分这些数据是否来自不同的发送方,就会导致出现错误。
建立连接
机器A发送syn包向机器B请求建立TCP连接,并附加上自身的接收缓冲区信息等,机器A进入SYN_SEND状态,表示请求已经发送正在等待回复; 机器B收到请求之后,根据机器A的信息记录下来,并创建自身的接收缓存区,向机器A发送syn+ack的合成包,同时自身进入SYN_RECV状态,表示已经准备好了,等待机器A 的回复就可以向A发送数据; 机器A收到回复之后记录机器B 的信息,发送ack信息,自身进入ESTABLISHED状态,表示已经完全准备好了,可以进行发送和接收; 机器B收到ACK数据之后,进入ESTABLISHED状态。
断开连接
我们知道网络是不稳定的,可能机器B 发送了一些数据还没到达(比FIN包慢); 同时回复的ACK包可能丢失了,机器B会重传FIN包;
源端口、目标端口:端口号用来区分主机的不同进程 校验码:用于校验数据包在传输的过程中没有出现错误,例如某个1变成了0 长度:报文的长度
UDP的缺点
无法保证消息完整、正确到达,UDP是一个不可靠的传输协议; 缺少拥塞控制容易互相竞争资源导致网络系统瘫痪
UDP的优点
效率更快;不需要建立连接以及拥塞控制 连接更多的客户;没有连接状态,不需要为每个客户创建缓存等 分组首部字节少,开销小;TCP首部固定首部是20字节,而UDP只有8字节;更小的首部意味着更大比例的数据部分 在一些需要高效率允许可限度误差的场景下可以使用。如直播场景,并不需要保证每个数据包都完整到达,允许一定的丢包率,这个时候TCP的可靠特性反而成为了累赘;精简的UDP更高的效率是更加适合的选择 可以进行广播;UDP并不是面向连接的,所以可以同时对多个进程进行发送报文
UDP适用场景
视屏直播 DNS RIP路由选择协议
分块传输
路由转换
正常情况下,主机A的数据包可以又 1-3-6-7路径进行传送 如果路由3坏掉了,那么可以从 1-4-6-7进行传送 如果4也坏掉了,那么只能从2-5-6-7传送 如果5坏掉了,那么就中断线路了
粘包与拆包
应用层需要向目标进程发送两份数据,一份音频,一份文本 TCP只知道接收到一个流,并把流拆分成4段进行发送 中间第二个报文的数据就出现两个文件的数据混在一起,这就是粘包 目标进程应用层在接收到数据之后,需要把这些数据拆分成正确的两个文件,就是拆包