运输层是整个网络体系结构中的关键层次之一,它为相互通信的应用进程提供逻辑通信
运输层向高层用户屏蔽了下面网络核心的细节,它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道,但这条逻辑通信信道对上层的表现却因运输层使用的不同协议而有很大的差别。当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的(只提供尽最大努力的交付),但这种逻辑通信信道就相当于一条全双工的可靠信道。但当运输层采用无连接的UDP协议时,这种逻辑通信信道仍然是一条不可靠信道。
运输层的两个主要协议:用户数据报协议UDP
传输控制协议TCP
UDP:在传送数据之前不需要先建立连接。远地主机的运输层在收到UDP报文后,不需要给出任何确认。虽然UDP不提供可靠交付,但在某些情况下UDP却是一种最有效的工作。
TCP:提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束之后要释放连接。TCP不提供广播或多播服务。由于TCP要提供可靠的,面向连接的运输服务,因此不可避免地增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大了很多,还要占用许多的处理机资源。
应用 | 应用层协议 | 运输层协议 |
---|---|---|
名字转换 | DNS(域名系统) | UDP |
文件传送 | TFTP(简单文件传送协议) | UDP |
路由选择协议 | RIP(路由信息协议) | UDP |
IP地址配置 | DHCP(动态主机配置协议) | UDP |
网络管理 | SNMP(简单网络管理协议) | UDP |
远程文件服务器 | NFS(网络文件系统) | UDP |
IP电话 | 专用协议 | UDP |
流式多媒体通信 | 专用协议 | UDP |
多播 | IGMP(网际组管理协议) | UDP |
电子邮件 | SMTP(简单邮件传送协议) | TCP |
远程终端接入 | TELNET(远程终端协议) | TCP |
万维网 | HTTP(超文本传送协议) | TCP |
文件传送 | FTP(文件传送协议) | TCP |
运输层的端口在运输层使用协议端口号,或者称为端口。是应用层的各种协议进程与运输实体进行层间交互的一种地址。TCP/IP的运输层用一个16位的端口号来标志一个端口,端口号只具有本地意义,它只是为了标志本计算机应用层中各个进程在和运输层交互时的层间接口。16位的端口号可允许有65535个不同的端口号,这对于一个计算机来说是足够的。运输层使用的端口号分为下面两大类:
(1)服务器端使用的端口号:分为两类熟知端口号0~1023 在http://www.iana.org可以在查到。
常用的熟知端口号
应用程序 | 熟知端口号 |
---|---|
FTP | 21 |
TELNET | 23 |
SMTP | 25 |
DNS | 53 |
TFTP | 69 |
HTTP | 80 |
SNMP | 161 |
另一类是登记端口号,数值为1024~49151
(2)客户端使用的端口号
数值为49152~65535.由于这类端口号仅在客户进程运行时才动态选择,因此又叫做短暂端口号。通信结束后端口号就不复存在。
用户数据报协议UDP只在IP数据报服务之上增加了很少一点的功能,这就是复用和分用的功能以及差错检测的功能。UDP的主要特点:(1)UDP是无连接的(2)UDP使用尽最大努力的交付
(3)UDP是面向报文的
(4)UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。很多实时应用(IP电话,实时视频会议等)要求源主机以恒定的速率发送数据,并且允许在网络发生拥塞时丢失一些数据,但不允许数据有太大的时延。UDP正好适合这种要求。
(5)UDP支持一对一,一对多,多对一和多对多的交互通信。
(6)UDP的首部开销小,只有8字节,比TCP的20个字节的首部要短。
UDP的首部格式
(1)源端口(2)目的端口(3)长度:UDP用户数据报的长度,其最小值是8字节(仅有首部)(4)检验和:检测UDP用户数据报在传输过程中是否有错,有错就丢弃。
UDP用户数据报首部中检验和的计算方法有些特殊。在计算检验和时,要在UDP用户数据报之前增加12个字节的伪首部。,它临时添加在UDP用户数据报前面,得到一个临时的UDP用户数据报。检验和就是按照这个临时的UDP用户数据报来计算的。伪首部既不向下传送,也不向上递交,仅仅是为了检验和。IP数据报的检验和只检验IP数据报的首部,但UDP的检验和是把首部和数据部分一起都检验,受检验的有(IP源地址,IP目的地址,源端口,目的端口,UDP数据部分)
TCP最主要特点
(1)TCP是面向连接的运输层协议
(2)每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。
(3)TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错,不丢失,不重复,并且按需到达。
(4)TCP提供全双工通信。
(5)面向字节流。
可靠传输的工作原理
1.停止等待协议
(a)无差错情况
(b)超时重传
(3)确认丢失和确认迟到
连续的ARQ协议
流水线发送方式,发送发维持一个发送窗口,每收到一个确认,就把发送窗口向前滑动一个分组的位置。接收方采用累计确认方式,对按序到达的最后一个分组发送确认。
TCP报文段的首部格式
(1)源端口与目的端口 各占2字节
(2)序号 占4字节 首部中的序号字段值是指本报文段所发送的第一个字节的序号 序号字段值=生存时间*数据率
(3)确认号 占4字节 是期望收到对方下一个报文段的第一个数据字节的序号
(4)数据偏移 占4位 单位是32位字 表示TCP首部的最大长度为60字节(60字节(32位是4字节))
(5)保留 为今后所用
(6)紧急URG 等于1时有效
(7)确认ACK 等于1时有效 TCP规定,在建立连接后所有传送的报文段都必须把ACK置1。
(8)推送PSH 相当于文件中的flash()
(9)复位RST
(10)同步SYN 在建立连接时用来同步序号。SYN=1表示这个是一个连接请求或者连接接受报文。
(11)终止 FIN:用来释放一个连接,当FIN=1时,表示此报文段的发送方的数据已发送完毕,并要求释放运输连接。
(12)窗口 占2字节。窗口值是0~655535之间的整数。窗口值作为接收方让发送方设置其发送窗口的依据。发送窗口值的大小=数据率*往返时间(因为最长在RTT时间内发送方能发现自己需要重传数据
(13)检验和 占2字节 检验首部和数据部分,计算检验和时,加上12字节伪首部。
(14)紧急指针 占2字节 URG=1时才有效。
(15)选项字段 长度可变,最多可达40字节。
最大报文段长度MSS:每一个TCP报文段中的数据字段的最大长度。
TCP可靠传输的实现
以字节为单位的滑动窗口
超时重传的时间选择
TCP流量控制
TCP持续计时器:TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。如果窗口仍然是0,那么收到这个报文段的一方就重新设置持续计时器。
TCP的拥塞控制
1.慢开始和拥塞避免:超时时,发送方调整门限值ssthresh=cwnd/2,同时设置cwnd=1;
2. 快重传和快恢复算法:收到3个连续的ACK之后,发送方调整门限值ssthresh=cwnd/2,同时设置拥塞窗口cwnd=ssthresh;
TCP连接建立
第一次握手:建立连接时,客户端发送syn包(syn=1)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=1),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
TCP连接的释放
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。四次挥手过程:
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
四次挥手原因:这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
TCP除了时间等待计时器外,还有一个保活计时器,服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是两个小时。若两个小时没有收到客户的数据,服务器就发送一个探测报文段,以后则每隔75秒钟发送一次。若一连发送10个探测报文段后仍无客户的响应,服务器就认为客户端出了故障,接着就关闭这个连接。