目录
- 概述
- 物理层
- 数据链路层
- 网络层 (1) 基础知识
- 网络层 (2) IP地址设计和用尽问题
- 网络层 (3) 网络层分组的传输流程
- 网络层 (4) 网络层多播等应用
- 运输层 (1) 可靠传输和TCP/UDP
- 运输层 (2) 拥塞控制和握手挥手
- 应用层 (1) HTTP和万维网
运输层的职责
网络层提供了端到端的逻辑通信,但是在计算机中我们是怎么使用网络的,我们是通过我们的应用程序作为窗口使用的网络,可见单独使用网络层还不能完成所有的工作,还缺少应用程序到计算机网络出口的支持,这也是运输层提供的功能。应用程序就是计算机中的进程,所以运输层提供了进程间的通信,他向它的上层应用层提供通信服务,是面向通信部分的最高层,面向用户功能的最次层。网络层的IP协议可以把主机发出的分组发送到目的主机,接下里就要通过运输层交给需要的进程(应用程序)了,通信的起点终点不是主机,而是主机中的进程。这种类似单位的收发室,所有的邮件送收发室,收发室再转到单独的个人手里,寄出也是同样的道理。那么都需要哪儿个些功能呢?
运输层功能
- 第一个就是复用和分用,收发室只有一个。复用是指都使用这一个收发室,所有寄出的邮件都通过这个途径寄出。分用是指送到收发室的邮件需要送到目的人手里。怎么标记寄出的人呢,在单位里可能是员工号,在计算机中就是端口。
- 第二个是数据部分的差错检测,网络层的IP数据报中有一个检验和字段,但是它只检查IP的首部部分是否正确,而不检查后面的数据部分。
- 可靠的传输,上一节网络层的IP数据报部分曾经说过,网络层只提供尽最大努力交付的服务,那么我们使用的网络就是不可靠的吗,可见并不是。在运输层可靠的传输使用TCP协议,不可靠的传输使用UDP协议。供上层的应用层根据需求选择使用。 接下来详细的讲下每个知识点
复用/分用与端口
既然要实现复用和分用,就要标记这个进程,在计算机中是怎么标记进程的,我们可不可以使用操作系统分配到进程号,显然是不行的,不同的操作系统进程号形式格式不尽相同,而且分配也是动态的。这个时候,就要想到网络层的IP地址和硬件地址MAC了,为什么不使用MAC地址,因为我们要依赖抽象,而不能依赖多种多样的MAC地址。我们只要管我们的IP地址即可,不管MAC地址怎么变化。这里也是一样,在互联网络,我们使用端口号标记传输两个端点的进程。
运输层拿到这个端口号,就会交给相应的应用进程。
端口号是一个16位的数字,端口号只有本地意义,即网络中有两个相同端口号是可以的,就像不同的单位有相同工号的人一样。
端口又分为两大类:
- 服务器使用的端口号:又分为熟知端口,在0-1023之间,这些端口号被分配给TCP/IP中比较重要的一些应用程序,比如FTP是21,DNS是53,HTTP是80,HTTPS是443。另一种是登记端口号,供新出的应用程序使用。为了防止重复需要到IANA注册。
- 客户端的端口号:数值为49152-65535。计算机本地分配的端口号。
怎么实现可靠的传输
可靠的传输需要什么呢。传输分为传输过程和接收过程,如果都不出问题,那么数据在传输中肯定可以到达终点,即可靠的传输。如果在传输中不出现差错,接收过程可以无限的接收,接收的缓存无限大的话,就是可靠的。但现实中和理想中的状况真的差太多了。现实中传输可能因为网络状况极差和网络超级阻塞,造成路由器丢弃数据导致传输过程造成差错。接收端的接收缓存更不可能是无效大的。所以我们只能选择当中间任何一个步骤出现差错时,发送端重新发送这个数据的方式,并根据接收的能力动态调节发送的速度来实现可靠的传输。
停止等待协议
通过名字就可以知道,这种方式的工作方式。发送端发送下一个数据的前提是收到了接收端的确认,如果一直没有收到确认并且超出了本地的超时计时器,就重新发送这个数据。这个过程中发送端需要缓存没有收到确认的数据,并且对数据进行编号,超时计时器的时间应该比传输的平均往返时间长。
但这中方式有一个缺点就是需要等待,等待的过程中,很多资源都被浪费了。那么怎么才能不等待呢?
连续ARQ协议
发送连续的n个分组,把等待的时间发送其他的数据,当收到过来的确认后,接着发送下一个数据。可以想象成一个窗口,先发送这个窗口内的所有数据,当窗口前面的数据收到确认后,就向后移动滑动窗口,发送窗口内新的数据。TCP协议中叫做滑动窗口协议。 接收方一般采用累计确认的方式,不必对接收的数据都发送确认,而是按照顺序最后一个到达的分组进行确认。表示这个分组之前的所有分组都接收到了。这样也有缺点,即如果丢失中间的一个,那么后面的数据即使成功到达也会被发送端重新发送。 通过这样的方式就可以完成不可靠的网络中的可靠传输。
运输层协议
UDP
用户数据报协议,在传输前不需要先建立连接,目的主机在收到UDP的报文后,不需要给出确认,可见是一种不可靠的传输方式。应用层DNS、DHCP、SNMP、NFS都是使用这个协议,他在IP协议上增加了什么功能呢,复用和分用肯定要有的,差错检测的功能也要有的。但是没有提供可靠传输,即如果数据错误,直接丢弃。不确认重传。
特点如下:
- 是无连接的:传输前不需要建立连接
- 使用尽最大努力交付:不保证可靠性
- 是面向报文的:对应用层下发的报文,增加了UDP首部后,直接传输。不做拆分和合并。
- 没有拥塞控制:因此网络出现拥塞时,还是按照原有的速率发出,速度不会下降。这对要起实时性的应用很合适,这种需求要求实时性,丢失数据倒是还好。但是没有拥塞控制,可能导致网络状态更差。
- 支持一对一、一对多、多对多
- 首部
❝端口号、目的端口号、数据部分长度、检验和(检查数据报传输时差错,计算后如果是错误就丢失数据),一共只有8字节。
❞
TCP
传输控制协议, 在传输前需要先建立连接,传输完成要释放连接。目的主机收到报文后,确认没有没有差错,要发送确认。相比UDP真的多了好多开销。应用层HTTP,FTP等都是使用这个协议传输。 主要特点:
- 面向连接的:传输前必须建立连接,传输完数据必须释放连接,就像打电话。
- 只支持一对一
- 提供可靠的交付服务,保证交付的数据不出错,不丢失,不重复,按需到达。
- 提供全双工的通信服务。发送和接受方都设有缓存,用来临时存放数据。
- 面向字节流:流是指流入到进程或从进程中流出的自己序列,把应用层下发的数据看成是一连串无结构的字节流。
- 起点终点是IP地址加端口好的套接字
- 首部: TCP提供的可靠传输服务所需的数据都在首部里,我们看看是怎么样的。
❝「发送端口和目的端口」:和UDP一致
❞
「序号」:上面实现可靠的传输中已经讲到了,如果要实现确认,就需要通过序号标记这段数据,由于TCP是面向字节流的,所以它的值就是这段数据在整条数据的开始位置字节数。 占4字节
「确认号」:提供确认所用,表示期望收到对方下一个报文的第一个数据的序号。占4个字节。在确认报文中,如果确认好是400,那么表示400字节以前的所有数据都收到了。
「数据偏移」:指出TCP报文的数据部分距离TCP的起始处有多远。就是表示TCP的首部有多长
「紧急URG」:当这个值是1时,表示这是一个紧急的数据,应尽快送达。
「确认」:ACK是1时,确认号才有效,是0时,确认号无效。
「推送」:PSH如果是1,当收到这样的数据后,会立刻交付到上方的应用层,而不会等到接收的数据缓存满了。
「复位」:RsT是1是表示TCP连接出现了严重的差错,必须释放连接。
「同步」:SYN在连接建立是同步序。是1表示这是一个连接请求或连接接收报文。
「终止」:FIN用开释放一个连接,是1时表示发送方的数据已经发送完成了。需要释放连接
「窗口」:占2字节。这个数据可以动态调节发送方的发送窗口。如果接收方的接收缓存快满了,接收的速度赶不上发送的速度后,如果还是按照原来的速度发送,那么肯定会使接收方丢失数据,因为接收缓存会满。如果希望变慢点发送,就把窗口值变小。这个值一般是接收缓存的剩余字节数据。
「检验和」:占2字节,检验包括首部和数据两部分的数据,和UDP类似。
「对比TCP和UDP的首部部分 和 可靠传输的原理,想想TCP是怎样实现可靠传输的?下一节会详细讲解TCP的部分,包括连接建立和可靠传输部分。」
本文使用 mdnice 排版