计算机网络之传输层

传输层概述

传输层协议为运行在不同Host上的进程,提供了一种逻辑通信机制,端到端的
逻辑:两个进程间好像直接连接的
发送方:将应用层递交的消息分成一个或多个Segment,向下传至网络层
接收方:将接收到的Segment组装成消息,向上交给应用层

传输层vs网络层

不同:
1、网络层提供主机与主机之间的逻辑通信机制
2、传输层提供应用进程之间的逻辑通信机制
联系:
1、传输层位于网络层之上;
2、传输层依赖于网络层服务;
3、传输层对网络层服务进行(可能的)增强

Internet提供的协议

TCP

可靠(不会丢失)、按序(按照发送顺序)的交付服务
1、拥塞控制;
2、流量控制;
3、连接建立

UDP

不可靠的交付服务
基于“尽力而为”的网络层,没有做(可靠性方面的)扩展

两种服务均不提供延迟和带宽方面的保障

复用和解复用

为什么?

基本原则:如果某层的一个协议对应直接上层的多个协议/实体,则需要复用/分用技术
因为网路层针对主机,传输层针对进程,并且每台主机上含有多个进程,所以需要多路复用和多路分用技术。
以下图为例:
1
主机2中有两个进程,p1和p2要接受来自其他主机的消息时,涉及多路分用,传输层必须要做的一件事就是必须把从网络层接收到的Segment传输至对应的进程
多路复用是针对从传输层至网络层

多路分用和多路复用

多路分用:传输层依据头部信息将收到Segment交给正确的Socket,即不同的进程
多路复用:从多个Socket接收数据,为每块数据封装上头部信息,生成Segment,交给网络层

多路分用?

主机(网络层)接收到IP数据报

  • 每个数据报携带源IP地址、目的IP地址
  • 每个数据报里都有一个Segment
  • 每个Segment里都有源端口号和目的端口号

TCP/UDP下Segment格式如下:
2
主机收到Segment后,传输层协议提取IP地址和端口号信息,依据端口号将Segment传至相应的Socket(TCP会做更多处理)

无连接多路分用

UDP的socket用二元组来标识(目的IP地址,目的端口号)
这样的话会导致来自不同源IP地址或源端口号的IP数据包若目的IP和端口均相同后会被导向同一个Socket
如下图所示:
3

面向连接多路分用

TCP的socket用四元组标识(源IP地址、源端口号、目的IP地址、目的端口号)
此时不同源IP地址或源端口号就会对应不同的Socket
如下图所示:
4
多线程形式:
5

UDP

基于IP协议;复用/分用;简单的错误校验,不进行错误恢复
为什么要在传输层做错误检测?
端到端的原则,第一点是不能保证所经过的每一个链路层均有错误检验机制,路由器在存储-转发的过程中也可能出错。
“Best effort”服务,可能丢失,可能非按序到达
无连接,发送方和接收方之间不需要握手建立连接,每个报文段间互相独立

为什么存在?

  1. 不需要建立连接,减少延迟,这也是为啥DNS使用UDP
  2. 实现简单,无需维护连接状态
  3. 头部开销少,UDP8字节,TCP20字节
  4. 没有拥塞控制,应用可更好地控制发送时间和速率

应用

常用于流媒体应用:容忍数据包丢失、速率敏感,对速度要求高
DNS和SNMP

如何在UDP上实现可靠数据传输?

在应用层增加可靠性机制,应用开发难度加大
应用特定的错误恢复机制

报文段格式

6

UDP校验和

目的:检测UDP段在传输中是否发生错误(0变1,1变0)
发送方:

  1. 将段的内容视为16-bit整数,段的内容包括UDP伪首部、UDP首部和数据报文
    8
  2. 校验和计算:计算所有整数的和,进位加在和后面,将得到的值按位求反,得到校验和
  3. 将校验和放入校验和字段

接收方:
计算所收到段的校验和,与校验和字段进行对比
相等是指没有检测出错误,但可能有错误
比如两个位发生了翻转,正好抵消

示例:
7