一、运输层概述
运输层向上面的应用层提供通信服务,是面向通信部分的最高层,也是用户功能中的最底层。“两个主机之间的通信”这种说法并不准确,因为真正进行通信的实体是在主机中的进程。一个主机中可能有多个进程与另一个主机中的多个应用进程通信。所以,从运输层的角度来看,通信的真正端点并不是主机,而是主机中的进程。即端到端的通信是应用进程之间的通信。每一台主机都有一个IP地址(至少一个),因此网络层为主机之间提供逻辑通信。而运输层为应用进程之间提供端到端的逻辑通信。
1.两个重要的协议
运输层有两个重要的协议:
- 用户数据报协议UDP(User Datagram Protocol):在传送数据之前不需要建立连接,目的主机收到报文后不需要给出任何确认。
- 传输控制协议TCP(Transmission Control Protocol):提供面向连接的服务,在传送数据之前必须建立连接,数据传送结束后要释放连接。由于TCP要提供可靠的、面向连接的运输服务,因此不可避免的增加了如确认、流量控制、计时器、连接管理等多种开销,不仅把协议数据单元的首部增大很多,同时会占用很多处理器资源。
2.端口号
在运输层使用协议端口号(Protocol port number)来标识通信的主机上的具体进程。这里的端口指得是应用层的各个协议进程与运输层实体进行层间交互的一种地址。TCP/IP的运输层使用一个16位端口号来标识一个端口。16位的端口号可以有65535个不同的端口号。这样一来,通信的两个主机之间的进程不仅要知道对方主机的IP地址,还需要知道应用进程的端口号。
运输层的端口号分为两大类:
(1)服务器端使用的端口号:分为熟知端口号(系统端口号)和登记端口号:
a.系统端口号:0~1023,常用的重要的系统端口号如下:
b.登记端口号:1024~49151,为没有熟知端口号的应用程序使用。
(2)客户端使用的端口号:49152~65535,留给客户进程使用的。
二、用户数据报协议UDP
1.UDP的特点
UDP的主要特点是:
- 无连接:发送数据之前不需要建立连接
- 尽最大努力交付:不保证可靠交付
- UDP是面向报文的:发送方对应用程序交下来的报文,在添加首部后就向下交付IP层。应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文
- UDP没有拥塞控制:网络出现的拥塞不会使源主机的发送速率降低(这对某些实时应用很重要,如IP电话、实时视频会议等)
- UDP支持一对一、一对多、多对多和多对一的交互通信
- UDP的首部开销小,只有8个字节
2.UDP首部格式
![](https://i-blog.csdnimg.cn/blog_migrate/d7d3458516942326719ae0d1f7e91ff3.png)
UDP首部共8个字节,分为4个字段:
- 源端口:源端口号,在需要对方回信时选用,不需要是可全为0
- 目的端口:目的端口号
- 长度:UDP用户数据报的长度,最小为8(仅有首部)
- 检验和:检测UDP用户数据报在传输中是否有错,有错就丢弃
三、传输控制协议TCP
1.TCP主要特点
- TCP是面向连接的协议,使用TCP协议前必须先建立好连接,数据传送结束后必须释放连接
- 每一个TCP连接只能有两个端点
- TCP提供可靠的交付,TCP连接传送的数据,无差错、不丢失、不重复、不乱序
- TCP允许通信双方的应用进程在任何时候都能够发送数据(全双工通信)
- TCP面向字节流,流指的是流入到进程或从进程中流出的字节序列。TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流,TCP并不知道所传送的字节流的含义。
![](https://i-blog.csdnimg.cn/blog_migrate/d349750d9662d1780f692b2fb4f76225.png)
TCP报文的长度并不是由应用进程来决定,而是根据对方给出的窗口值和当前的网络拥塞程度来决定。(TCP可以把一个过长的报文段划分为几个短一些再发送,也可以把几个很短的报文段积累到一定数量再发送)。
2.TCP连接
TCP的特点之一是每一条TCP连接只能有两个端点。端点又叫做套接字(Socket)或者插口,而套接字是IP地址和应用进程端口号的组合:
套接字socket=(IP地址:端口号)
3.可靠传输的工作原理
TCP发送的报文是交给IP层传送,而IP层是不可靠的传输,因此TCP必须采用适当措施才能使得两个运输层之间的通信可靠。
3.1.停止等待协议
无差错情况:通信的双方(不妨设发送方为A,接收方为B),A每完成发送一个分组M1,就先暂停发送,等待B的确认。B收到了M1就先A发送确认。A在收到了B对M1的确认后,才发送下一个分组M2。如下图:
超时重传:当B在接收M1时检测出了差错,就丢弃M1,也不会通知A收到有差错的分组。A只要过了一段时间没有收到确认,就认为刚才发送的分组M1已经丢失了,就会重传分组M1.每发送完一个分组,就会设置一个超时计时器,如果在超时计时器到期之前收到了确认,就撤销已设置的超时计时器。因此,需要注意以下几点:
- A在发送完一个分组M后,应该保留M的一个副本,以便在需要的时候重传;
- 分组和确认都必须编号,以便明确发送出去的哪一个分组接收到了B的确认,哪一个分组没有接到确认;
- 超时计时器的重传时间必须比数据在分组传输的平均往返时间更长一些。
确认丢失和确认迟到:在超时计时器重传时间到期后,A会再次发送分组,M收到分组后同样会进行确认。假设B发送的确认丢失了,A在重传时间内没有收到确认,A同样会发送上次的分组,这时B的操作时什么呢?丢弃本次的分组(因为编号显示已经收到过了),并向A发送确认(否则A还要发)。
3.2.连续ARQ协议
停止等待协议比较简单,但会使信道利用率很低。如下图:
假设A发送一个分组的时间是TD,B发送确认的时间是TA,往返时间是RTT,其余时间忽略不计(B处理分组的时间、A处理确认分组的时间),那么信道利用率为U=TD/(TD+RTT+TA),若TA忽略不计,那么信道利用率U很低,信道在大部分时间里都是空闲的。(假设1200km的信道,往返时间RTT=20ms,分组长度为1200bit,发送速率为1Mb/s,计算得到U小于6%)。
为了提高信道利用率,可以采用流水线传输协议,发送方可以连续发送多个分组,不必每发送完一个分组就停下来等待对方的确认,这样可以使信道上一直有数据不间断传送。
![](https://i-blog.csdnimg.cn/blog_migrate/1fd1dca7c07f5bc99aa49270f21428f4.png)
下图(a)表示发送方维持的发送窗口,位于发送窗口内的5个分组都可以连续发送出去,而不需要等待接收方的确认。发送方每受到一个确认,就把发送窗口向前移动一个分组的位置。接收方一般采用累积确认的方式,不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,这就表示,到这个分组为止的所有分组都已经正确收到了。
![](https://i-blog.csdnimg.cn/blog_migrate/24c004f4be66bc7470f05dfe016c6d32.png)
四、TCP报文段的首部格式
TCP虽然是面向字节流,但TCP传送的数据单元是报文段。一个TCP报文段分为首部和数据两部分。
TCP报文段的首部的前20个字节是固定的,后面有4n个字节是根据需要增加的选项。TCP首部的最小长度是20字节。
![](https://i-blog.csdnimg.cn/blog_migrate/b96ad630f69e122215d62e42335d1836.png)
(1)源端口和目的端口:各2个字节,源端口号和目的端口号;
(2)序号:4字节,0~2^32-1,共2^32个序号,序号增加到2^32后,下一个序号又是0。TCP连接中传送的字节流中的每一个字节都按顺序编号。首部中的序号字段指本报文段发送的数据的第一个字节的序号。
(3)确认号:4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,表示N-1个序号的数据都已经正确收到。
(4)数据偏移:4个比特,指出TCP报文段的首部长度。
(5)保留位:6个比特
(6)紧急URG:当该位为1时,紧急指针段有效,它告诉系统此报文中有紧急数据,应尽快传送;
(7)确认ACK:ACK=1时该字段有效,TCP规定,在连接建立后所有传送的报文段都必须把ACK置为1;
(8)推送PSH:很少操作
(9)复位RST:RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接;
(10)同步SYN:连接建立时用来同步序号,当SYN=1,ACK=0,表明这是一个连接请求报文段。对方若同意连接,这应在响应的报文段中使SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求或连接接受报文。
(11)终止FIN:FIN=1表示释放一个连接。
(12)窗口:2字节,指发送本报文段的一方的接收窗口(而不是自己的发送窗口)。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。窗口值作为接收方让发送方设置其发送发送窗口的依据。窗口值经常是在动态变化。
(13)检验和:2字节,检验首部和数据。
(14)紧急指针:2字节,当URG=1时有效,指明紧急数据的字节数;
(15)选项:长度可变,最长为40字节,当没有使用“选项”时,TCP的首部长度是20字节;