运输层是向上面的应用层提供通信服务,是面向通信部分的最高层。

两个主机使用了网络中的核心部分功能进行端到端通信的时候,只有主机的协议栈才能有运输层,那么路由器在转发分组的时候,只能用到下三层的功能。

计算机网络:运输层_数据

运输层为应用进程之间提供端到端的逻辑通信,网络层是为主机之间提供逻辑通信。

运输层还要对收到的报文进行差错检测,在网络层,IP数据报首部中的检验和字段只是检验是否出现差错,并没有对数据部分检测。

计算机网络:运输层_端口号_02

运输层的两个主要的协议:

  1. 用户数据报协议
  2. 传输控制协议

用户数据报协议UDP

计算机网络:运输层_端口号_03

UDP不提供可靠交付,在传输数据之前,不用建立连接,其他主机在运输层接受到UDP报文后,没有给出任何确认。

UDP的主要特点是

  1. 无连接
  2. 尽最大努力交互
  3. UDP面向报文,UDP对应用层交付的报文,不合并也不拆分,保留了这些报文的边界,
  4. 计算机网络:运输层_端口号_04

  5. UDP没有阻塞控制,所以网络出现阻塞的时候,源主机的发送速率并不会降低。比如IP电话、实时视频会议
  6. UDP支持一对一、一对多、多对一和多对多的交互通信
  7. UDP的首部开销很小,只有8个字节,TCP是20个字节的首部

UDP首部格式

UDP有两个字段:数据字段和首部字段,首部字段很简单,8个字节,由四个字段组成:

计算机网络:运输层_运输层_05

  1. 源端口,在需要对方回信的时候选用,不需要时可用全0
  2. 目的端口号,,在终点交付报文 时必须使用
  3. 长度,UDP用户数据报的长度,
  4. 检验和,检测UDP用户数据报在传输中是否有错,出现错误就丢弃

计算机网络:运输层_数据_06

TCP

TCP面向连接的服务。在传输数据之前必须先建立连接,数据传输结束后,会释放连接。

TCP提供了可靠的面向连接的运输服务,包括确认、流量控制、计时器以及连接管理等等,这样会让协议数据单元的首部增大很多,还需要许多的处理机资源。

计算机网络:运输层_数据_07

TCP的特点:

  1. 面向连接的运输层协议,应用程序在使用TCP协议之前,会先建立TCP连接
  2. 每一条TCP连接只能有两个端点,只能是一对一
  3. TCP提供可靠的交付服务,通过TCP连接传送的数据,无差错、不丢失、不重复并且按序到达。
  4. TCP提供了全双工通信,就是TCP允许通信双方的应用进程在任何时候都能发送数据。两端都设置有发送缓存和接收缓存,临时存放双向通信数据。
  5. 面向字节流,TCP中的“流”是指流入到进程或从进程流出的字节序列。

计算机网络:运输层_运输层_08

TCP的连接

TCP连接的两个端点不是主机、不是主机IP、也不是应用进程、也不是运输层的协议端口,是套接字或者是插口。端口号拼接到IP地址构成套接字。例如192.3.4.5:80

套接字 socket = IP地址:端口号

一条TCP连接有两个端点就有两个套接字。

TCP连接有三个阶段

连接建立,如下图:

计算机网络:运输层_端口号_09

用三次握手建立TCP连接:

一次:客户端A向服务端B发出连接请求报文

二次:服务端B收到连接请求报文后,如果同意连接,则向客户端A发送确认

三次:客户端A接收到服务端B的确认后,还向服务端B发出确认,客户端进入已建立状态

计算机网络:运输层_数据_10

数据传输结束后,通信的双方都要释放连接,如上图所示。

第一次放手:客户端A应用进程先是向服务端B发出释放报文段并且停止发送数据,主动关闭TCP连接。然后等待B的确认;

第二次放手:B接收到释放报文段后,发出确认,之后服务端B进入关闭等待状态。这个时候TCP服务器进程通知高层应用进程,A到B方向的上连接就释放了。整个TCP连接处于半关闭状态;

第三次放手:B向A发送释放报文段,之后进入等待状态,是在等待A的确认;

第四次放手:A收到B的释放报文段后,必须发出确认,之后进入时间等待状态,这时候,TCP连接并没有释放,必须经过时间等待计时器设置的时间2MSL后,A才进入关闭状态。

TCP报文段的首部格式

TCP传送的数据单元报段。一个TCP报文段分为首部和数据两部分

TCP报文段的首部前20个字节是固定的,后面4n字节是根据需要而添加的。

计算机网络:运输层_运输层_11

运输层为什么要用端口号?

单个计算机中的进程是用标识符来标志的,但是在因特网环境下,计算机操作系统种类很多,而不同的操作系统,使用的是不同格式的进程标识符。为了让运行不同操作系统的计算机的应用进程能够互相通信,就需要用统一的方法对TCP/IP体系的应用进程进行标志。

这个方法就是在运输层使用协议端口号。

在协议栈层之间的抽象协议端口号是软件端口号。和路由器或者交换机上的端口号不同,硬件端口号是不同硬件设备进行交互的接口。

软件端口号的应用层的各种协议进程与运输实体进行的层与层之间交互的一种地址。