传输层的主要作用是负责向两台主机进程之间的通信提供数据传输服务。
传输层的协议主要有传输控制协议TCP和用户数据协议UDP。
先从较简单的UDP协议来看, UDP报文由 UDP报头 和 UDP数据荷载 组成. 可以认为UDP协议就是在应用层数据的基础上添加 8 个字节的报头. 其中 源端口号, 目的端口号, 数据报长度,校验和 都为两个字节.
TCP具有可靠连接, 有连接, 面向字节流, 全双工的特点.
TCP报头:
可靠传输是TCP十分关键的机制. 在数据传输的时候, 很可能遇到数据传输不知道是否收到和乱序的特点, 如下, 对一位爱学习的朋友发出邀请:
明明 “不去” 回复的是去网吧,此处却乱序了,意思也就随之改变, 这样的传输是不可靠的.
但为了实现可靠传输, 我们就采用了确认应答.
超时重传是在确认应答的基础上对可靠传输做出进一步保证. 如果数据在传输过程中丢失, 那么应答报文就无法发出. 发出数据方长时间没有接收到应答报文后, 明白是数据传输出现了问题, 在重新发送数据.
重传如果再次失败, 还会再次重传, 但也不是无止尽的, 在多次重传失败后, 就明白网络出现了问题, 会断掉此次连接.
连接管理主要是两个部分:
三次握手就是为了确认客户端和服务器双方的接收和发送能力都正常.
客户端和服务端之间, 经过三次交互, 完成了连接的建立(见面,你好,握手嘛), 三次握手是抽象的比喻:
同步报文:
TCP协议的首部有六个标志位
应答报文:
明明双方一共发送了四次数据, 问什么说是三次握手呢, 这是因为中间的一次 SYN同步报和ACK应答是一起返回的, 所以说是三次握手.
总结, 三次握手的意义:1. 确定双方接收发送数据的能力正常 2.协商数据传输的重要参数
挥手, 可以形象的认为是再见, 也就是断开连接.
所谓四次, 就是客户端和服务器双方各自发送一个FIN结束报文和接收一个ACK应答报文, 这样完成四次挥手后, 断开连接.
此处我们可以看到 中间的FIN结束报文 和 ACK应答报文 并没有结合到一起. 所以是四次挥手.
为什么连接要握手三次, 断开连接要挥手四次?
因为需要确保通信双方都能通知对方释放连接,假设客服端发送完数据向服务端发送释放连接请求,当客服端并不知道,服务端是否已经发送完数据,所以此次断开的是客服端到服务端的单向连接,服务端返回给客户端确认报文后,服务端还能继续单向给客户端发送数据。当服务端发送完数据后还需要向客户端发送释放连接请求,客户端返回确认报文,TCP连接彻底关闭。所以断开TCP连接需要客户端和服务端分别通知对方并分别收到确认报文,一共需要四次。
客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接, 为什么呢?
MSL的意思是报文的最长寿命,可以从两方面考虑:
滑动窗口是在TCP可靠性的前提下, 尽量提升传输效率. 这个提高传输效率的本质是就是把等待ACK的时间叠加起来, 减少了等待时间.
等待时间, 等待的就是数据传输和发送过程中的时间. 这是占用的大部分时间.
所以我们使用滑动窗口进行数据的批次发送, 从而减少等待的时间.
假设发送方一次发四组数据(1000,2000,3000,4000), 然后接收方一起返回(1001,2001,3001,4001)的应答报文, 但是并不是要全接收到这四个应答报文才能继续发送, 只要返回了1001这一起始应答报文, 发送方就可以发送5000这一个数据, 但是如果起始报文1001丢失, 那么就要重新发送1000, 并且等待1001应答报文重新返回.
此处可以看视频理解一下.
丢包分为两种情况:
如果是ACK丢失, 类似1001应答报文丢失, 但是 2001应答报文接收到了, 我们就认为1000数据也发送到了, 也就是ACK报文可以通过后续的ACK报文确认.
1.
由于 1001-2000 这个数据丢了,所以 B 就再反复索要 1001 这个数据。即使 A 给 B 已经发后面的数据了,这个时候 B 仍然再索要 1001 这个数据.
当 A 被 B 索要多次之后,A 就明白了这个数据丢了,就会触发重传.
一直到B接收到1001-2000数据后, 就会返回7001的应答报文.
流量控制本质上就是对滑动窗口的制约, 同时也又考虑了可靠性, 滑动窗口的窗口越大, 那么数据发送的就越快, 那么流量控制就是对发送速率做制约.
流量控制, 是站在接收方的角度, 来控制发送效率.
但是整体的传输, 不仅在于接收方和发送方的速率, 也取决于中间一系列用于转发的设备.
那么, 我们如何知道多少的数据流量(窗口大小)才是最合适的呢?
这就需要我们通过做实验的方式来得到最合适的窗口大小:
延时应答也是一个提高效率的机制, 延时应答, 就是为了使窗口可以大一些.
延时应答, 顾名思义, 就是将ACK应答报文的发送时间减后, 使发送ACK应答报文的这边可以处理缓冲区的数据, 使缓冲区更大, 从而使数据一次传输的量更大.
捎带应答说基于延时应答的基础上, 为了提高传输数据而产生的.
正常来说, ACK报文是应该立即返回的, 但是基于上文的延时应答, 我们可以将ACK应答报文和响应数据一起返回, 从而减少等待数据传输等待的总时间.
面向字节流, 指的是读写载荷数据的时候, 是按照"字节流"的方式来读写的,但是 TCP数据报, 本身仍是以数据报的形式传输的(应用程序是感知不到哪里到哪里是一个数据报的)
粘包问题指的是, 一个TCP连接里, 传输多个应用层数据报, 这时候就容易区分不出哪里到哪里是一个完整的数据报.
粘包问题的根本原因是TCP面向字节流, 直接影响的是应用层代码
粘包问题的解决方案:
进程终止就相当于在任务管理器中关闭程序,
就会触发 杀死进程-> 释放进程PCB -> 释放文件描述符表上对应的资源, 然后出发FIN, 并进行四次挥手.
主机关机之前会先关闭进程, 即先出发上文的进程终止.
也是需要释放进程的资源, 并四次挥手
如果是台式机掉电, 那么连接直接就断开, 也就来不及挥手了
a. 如果台式机是接收方: 发送方尝试发送数据, 发现没有ACK, 会多次传输数据, 当一直没又ACK时, 会知晓网络出现了问题, 也就会断开连接
b. 如果台式机时发送方: 接收方一直在等待发送方的数据传输, 但是发送方出现了问题, 这时候数据长时间没有传输, 这时候接收方就会发送一个心跳包.
心跳包: 是周期性的, 判断对方是否存活的报文
接收方给发送方发送一个特殊的报文(ping),
发送方如果存活, 就应该返回一个特殊的报文(pong)
如果没有返回, 就认为发送方挂了
网络层协议的工作:
路由选择
地址管理
IP协议报头:
4位版本号 : 只有 4 和 6 --> ipv4 ipv6
4位首部长度: IP报头的长度
8位服务类型:
16位总长度: 指的是一个IP数据报又多长(报头 + 荷载), 荷载就是一个(完整的TCP数据报)
8位协议: 表示了传输层使用了哪些协议
16位首部检验: 这个检验是对首部的检验, 对数据部分的检验由传输层负责
IP地址分为两部分: 网络号 + 主机号
要求: 同一个局域网里的网络号是相同的, 主机号是不同的. 两个相邻的局域网, 网络号是不同的.
但是对于一个32位的IP地址来说, 到底前多少个bit位是网络号是不固定的, 我们也就引入了 “子网掩码” 来表示前多少个bit位是网络号.
子网掩码: 32位, 用点分十进制来表示的整数
a. 如果主机号全为0, 就表示该IP为网络号
b. 如果IP的主机号为1, 那么该IP就是一个"广播IP", 往这个IP上发的信息, 整个局域网都能收到.
c. IP地址是127开头的, 就是环回IP表示主机自己
d. 局域网内部IP: 10 开头 或192.168 开头或172.16-172.31 开头
e. 广域网的IP(外网IP), 是唯一的, 一个IP对应唯一一个设备.
当前的 IPv4 协议,使用的地址是 32 位的整数。32 位整数表示的数据范围,就是 42亿9千.但是当前世界的网络设备远远超过这个数字, 所以就有了其他方法:
路由选择也就是规划路径,当两个设备之间,要找出一条通道,能够完成传输的过程, 类似于"问路",一跳一跳进行转发.
路由器内部维护了一个数据结构(路由表),记录了一些网段信息(网络号)
ARP协议属于网络层的协议,主要作用是实现从IP地址转换为MAC地址。在每个主机或者路由器中都建有一个ARP缓存表,表中有IP地址及IP地址对应的MAC地址。先来看一下什么时IP地址和MAC地址:
IP地址:IP地址是指互联网协议地址,IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
MAC地址:MAC地址又称物理地址,由网络设备制造商生产时写在硬件内部,不可更改,并且每个以太网设备的MAC地址都是唯一的。
数据链路网的主要协议是: 以太网. 每个网卡都有一个唯一的mac地址, mac地址是唯一的, 在出厂时就固定了.
mac地址是6个字节的, 所以足够.
简单来说,标识网络中的一台计算机,比较常用的就是IP地址和MAC地址,但计算机的IP地址可由用户自行更改,管理起来相对困难,而MAC地址不可更改,所以一般会把IP地址和MAC地址组合起来使用。具体是如何组合使用的在上面的ARP协议中已经讲的很清楚了。
DNS的定义:DNS的全称是(domain name system),即域名系统。DNS是因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的去访问互联网而不用去记住能够被机器直接读取的IP地址。比如大家访问百度,更多地肯定是访问 www.baidu.com ,而不是访问112.80.248.74,因为这几乎无规则的IP地址实在太难记了。DNS要做的就是将www.baidu.com解析成112.80.248.74。