从现在开始,我们开始传输层的学习,自顶向下第六版中改成了运输层,感觉怪怪的
书中打了邮政服务和代收发信件的兄弟姐妹之间的比方,非常贴切
这是传输层和网络层的作用区别,也就是说,传输层管的是主机内部的文件传输
多路复用与多路分解
多路复用:在源主机不同套接字收集数据块,每个都装上首部信息,生成报文段,然后将报文段传递到网络
多路分解:将传输层报文段中的数据交付到正确(通过首部信息)的套接字
先介绍几个名词
名词 | 意义 |
---|---|
数据块 | 拆解下来的数据 |
报文段 | 运输层给数据块封装上首部信息,包含源端口号和目的端口号 |
数据报 | 网络层给报文段封装上首部信息,包含源IP地址和目的IP地址 |
套接字 | 连通应用层和传输层的管道 |
在面向连接的多路复用中
这是报文段的内部结构
在主机连接中如图,报文段用4个端口号简要代替
复用要求:
为什么有这个要求?是因为最终是要分解出来的,所以要保证能够正确分解,这个要求是匹配分解服务的规则的
分解服务:
- 套接字分配端口号
- 运输层检查报文段中的端口号,并定向到套接字
- 报文段中的数据通过套接字传到所连接的进程
以上,也是UDP的传输过程,但是TCP要复杂得多
UDP协议
UDP协议其实很简单,没有什么好讲的,但是可以为理解TCP打下基础
这是使用UDP协议的报文段,首部只有4个字段,每个字段由两个字节组成,也就是他的头部只有8字节(TCP头部比他多很多)
可以看到有一个checksum,这叫校验和,这是什么呢?下面你就知道了
具体内容
看了上面这个图,你可能会奇怪
1.既然UDP不可靠,他为什么还要加上错误校验
这个错误校验比起TCP的要简单得多,多加这个在某种程度上可以减少错误率而不至于影响到UDP的速度,稍后会介绍
2.UDP也能增加可靠传输吗?
是的,事实上,TCP协议就是在UDP协议基础上构建的,只不过是封装好直接用
我们用UDP通过在应用层添加机制可以完成TCP的功能
校验和
目的:检测UDP段在传输中是否发生错误(如位翻转)
举例说明
一、发送方
- 假设数据中有3个16比特的数
- 求出前两个的和
- 前两个的和加上第三个数,如果溢出就回卷,及和去掉最高位,然后+1
- 现在已经加完了所有16比特的数,取反码就变成了校验和,然后发送
二、接收方
- 将4个16比特的数(包含校验和)加起来,一定等于1111 1111 1111 1111(相当于两个反码相加),这也是取反码做校验和的原因
- 如果不等,校验和错误,传输出现问题
相信你能想到,这个还是太脆弱了,仅仅只能解决数据缺失问题,而比如其中16比特的数互相交换位置这类错误无法检测
而且,他也只能知道发生了错误,而不知道哪里发生了错误
重点要学习的是TCP协议,以上仅仅只是学习TCP的前置知识