概述
只有主机在有的层次
为应用层提供通信服务 并且可以使用网络层提供的服务
传输层的功能
- 传输层提供给进程与进程之间的逻辑通信
1. 与网络层的区别是 网络层是为主机与主机之间的通信提供服务 所以一般到网络层的时候 数据传输是还没有完成的 2. 从网络层来说 通信的双方是两台主机 IP数据报的头部给出了这两台主机的IP地址 3. 但“两台主机之间的通信”实际上是两台主机中的应用进程之间的通信 应用进程之间的通信又称端到端的逻辑通信 4. “逻辑通信”意思是传输层之间的通信好像是沿水平方向发送数据 实际上是自上而下的数据封装之后发送到目的主机然后再自下而上解封装 - 复用和分用
1. 复用是指发送方不同的应用进程都可以使用同一个传输层协议传送数据 2. 分用是指接受方的传输层在剥去报文的头部之后能够正确把这些数据交付到目的应用进程 3. 注意 传输层的复用分用和网络层的复用分用功能不同 4. 网络层的复用是指发送方不同协议的数据都可以封装成IP数据报发送出去 5. 网络层的分用是指接收方的网络层在剥去头部之后把数据交付给相应的协议 - 传输层对收到的报文进行差错检测
1. 传输层会检查报文的头部和数据部分 2. 网络层只检查报文的头部 不会检查数据部分是否出错 - 传输层的两种协议 : TCP UDP
1.网络层无法同时实现这两种协议 要么只提供面向连接的服务 要么只提供无连接服务
传输层的两种协议
大概说一下 后面详细说
TCP
面向连接的传输控制协议
传送数据之前必须建立连接 数据传送结束后要释放连接 不提供广播或多播服务 由于TCP要提供可靠的面向连接的传输服务 因此不可避免增加了需要开销 : 确认、流量控制、计时器以及连接管理等
由于是面向连接的 所以比较可靠 但是时延比较大 适用于大文件
UDP
无连接的用户数据报协议UDP
传输数据之前不需要建立连接 收到UDP报文后也不需要给出任何确认
因为无连接 所以不太可靠 但是时延小 适用于小文件
比如一个小表情包之类的
传输层的寻址与端口
复用 : 应用层所有的应用进程都可以通过传输层再传输到网络层 分用 : 传输层从网络层收到数据后交付指明的应用进程
那么分用时如何指明呢 需要一个唯一的标识 叫做端口
端口
- 端口是传输层的SAP 标识主机中的应用进程
- 端口有一个唯一的标识叫做端口号
- 端口号只有本地意义 在因特网中不同计算机的相同端口是没有联系的
- 端口号长度为16bit 能表示65536个不同的端口号
- 传输层使用的是软件端口
- 硬件端口是不同硬件设备进行交互的接口 软件接口是应用层的各种协议进程与传输实体进行层间交互的一种地址
- 数据链路层的SAP是MAC地址 网络层的SAP是IP地址 传输层的SAP是端口
按照端口号的范围有服务端使用的端口号和客户端使用的端口号
- 客户端口号在一个进程结束的时候就可以分配给另一个进程 是可以复用的
- 熟知端口号是固定的 见下图
套接字
- 在网络中采用发送方和接收方的套接字组合来识别端点
- 套接字唯一标识了网络中的一个主机和它的一个进程
UDP协议
主要特点
- UDP是无连接的 减少开销和发送数据之前的时延
- UDP使用最大努力交付 即不保证可靠交付
- UDP是面向报文的 适合一次性传输少量数据的网络应用
- UDP无拥塞控制 适合很多实时应用
- UDP头部开销小 8B 而TCP是20B
这里可以看到 应用层给UDP多长的报文 UDP就照样发送 即一次发一个完整报文 是不会对应用层的报文进行修改的
如果应用层的报文太大的话 就会导致网络层的IP数据报过大 会使IP数据报分片 影响网络层的效率
如果应用的报文太小的话 就会导致网络层的IP数据报数据部分比IP头部还小 也会影响网络层的效率
UDP首部格式
8个字节的首部字段 其余部分为数据字段 当然数据字段是可以为0的 所以UDP数据报最小就是8个字节
16位源端口号是可有可无的 比如当前数据报不需要回复的话 源端口号就可以全为0
16位目的端口号是必须有的 需要指明当前数据报要发给谁
16位UDP长度是整个数据报的长度
16位UDP检测和 检测整个UDP数据报是否有错 错就丢弃
分用时 找不到对应的目的端口号 就丢弃报文 并给发送方发送ICMP “端口不可达”的差错报告报文
UDP检验和的检验过程
UDP用户数据报首部那里加了一个伪首部 研究一下这个
伪首部里面包含了
- 源IP地址
- 目的IP地址
- 0 : 固定全0
- 17 : 首部的协议字段 UDP协议对应的字段值就是17
- UDP长度
所以是模仿了IP数据报的首部
伪首部只有在计算检验和时才出现 不向下传送也不向上递交
这里学习一下如果使用伪首部进行校验的 这张图是发送端准备发送的UDP数据报 加上伪首部部分
把这个整体看作是好多个16进制字串组成的 那么每4个字节分一下
我们知道UDP首部后面有16位的检验和 这里先填0
如果数据部分不够16位的话 需要补0
这是第一步
接下来伪首部+首部+数据部分采用二进制反码求和
然后把去和的反码填入检验和字段
这时候就可以去掉伪首部了 然后发送端就可以发送报文了
这时候来到接收端 进行两个步骤
第一个步骤 再把伪首部填回去
然后伪首部+首部+数据部分采用二进制反码求和
这里注意首部最后2B我们已经填上了在发送端计算出来的检验和
加起来之后 如果结果16位都是1 那么说明无差错
否则丢弃数据报 或者交给应用层附上出差错的警告 剩下的事情就由应用层处理了
TCP协议
|