从上图可以看到,输出端口是做的输入端口的逆过程,将网络层的数据包转换为链路层的数据帧,最后转为物理层的比特流。
输入和输出端口需要注意的是,它们都有一个缓冲队列,比如输入数据的速度太快,输出数据速度慢,为了平衡输入输出速度,就用缓冲队列把数据缓冲下来,一个一个慢慢的处理,但缓冲队列也有限度,超出这个限度,缓冲队列容纳不下,包就会被丢到。
马上就要到对前端最重要的传输层和应用层知识了!准备接招!
8 传输层知识传输层是只有计算机才有的层次,主要提供是进程间逻辑通信 可靠传输或者不可靠的功能。比如你的QQ跟你异地女友的QQ视频聊天,这就是不同计算机之间,进程间的通信。
这里简单说一下可靠传输协议TCP 不可靠传输协议UDP。
8.1 端口号有什么用TCP面向连接,可靠,不提供广播和多播,而且时间延迟比较大,适用于大文件传输。 UDP无连接,收到的报也不确认,但时间延迟小,适用于小文件。
端口号可以用来标识同一个主机上通信的不同应用程序(就是哪个应用程序在使用这个端口)。
那为什么一个端口只能分配给一个应用程序,不能是多个呢?
如果服务器有两个应用程序A,B,分别启动了A服务和B服务,它们监听同一个端口,那有数据来的时候,服务器无法判断这个数据到底是给A,还是给B。
8.2 UDP协议UDP协议是参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
(1) UDP协议的特点
- UDP是无连接的,减少开销和发送数据之前的时间延迟。大家都知道TCP的三次握手和四次分手,这个是需要时间花销的,但是UDP没有这部分花销。
- UDP使用最大努力交付,即不保证可靠交付。那谁来保证可靠的交付呢?是由UDP的上一层协议,应用层来保证。
- UDP是面向报文的,适合一次性传输少量数据的网络应用。什么意思呢,如下图,UDP这层,把应用层的全部内容作为自己的数据报部分,在IP层也只是加了一个IP首部,我们知道,在以太网,链路层上的数据如果超过1500字节,就会分片,所以网络层发现上面传输层给了太大的数据就会分片,加上UDP是不可靠的协议,这就加大了UDP的不可靠性,容易丢失,所以UDP适合数据量少的。
- UDP没有拥塞控制,适合很多实时应用。也就是说如果网络堵塞,UDP不管那么多,照样按照自己的速率发数据,那有些人就会说,这协议是不是有点坑B,路都堵上了,还发死劲发数据呢,但是反过来看,这也是UDP的优点,它允许丢包,如果你的网络情况还不错,UDP就非常适合实时应用,比如视频会议。
- UDP首部较小,只有8字节,而TCP由20字节。这也是减少网络传输开销的一方面。
(2)UDP首部
- 16位端口号占了2B,也就是16位,说明端口号的范围是0 - 65535。源端口号可以没有,因为不希望收到对方的回应,可以写全0,目的端口是一定要有的。
- 16位UDP长度是指首部 数据的长度,比如数据2B,首部固定是8B,那么UDP长度就是2 8 = 10B
- 16位UDP校验和,是用来校验首部和数据有错误,如果有错就丢弃掉。比如说目的主机找不到对应的端口号,就会给发送方返回一个ICMP,‘端口不可达’的差错报文。
TCP协议简单来说是一种位于传输层的,面向连接的、可靠的、基于字节流的传输层通信协议 TCP协议的特点:
- TCP是面向连接的传输层协议。比如说TCP的三次握手,四次分手,针对的都是连接。
- 每一条TCP连接只能有两个端点,每一条TCP连接是点对点的。也就是说TCP是不同计算机之间的进程的通信。
- TCP提供可靠交付的服务,无差错,不丢失,不重复,按序到达。总结一下就是,可靠有序,不丢不重。
- TCP提供全双工通信。全双工指的是连接双方可以同时收发数据。在收发两端都有发送缓存和接收缓存,发送缓存就是一个准备发送的队列,接收缓存是一个准备接收的队列。
- TCP面向字节流。如下图,我们解释一下什么是面向字节流: 图中的1,2,3,4.....数据块,每一个表示一个字节。tcp将应用层的数据变为了这样的字节进行发送,比如玩过node同学,知道一个buffer,buffer就是字节流。
TCP报文的首部格式
如下图所示,我们看一下比较重要的一些首部字段,这里我们介绍固定的20字节的TCP首部
- 源端口和目的端口分别是指发送方应用程序的端口和目的方应用程序的端口号。
- 序号是指在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的第一个字节的序号。
- 确认号是指期望收到对方下一个报文段的第一个数据字节的序号。弱确认好位n,则证明到需要N-1为止所有的数据都已经正确收到。如下图,我们举例说明一下