本节书摘来自异步社区《TCP/IP路由技术(第一卷)(第二版)》一书中的第1章,第1.6节,作者【美】Jeff Doyle,CCIE #1919,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.6 主机到主机层
TCP/IP协议的主机到主机层的命名恰如其分。尽管网络层负责网络之间的逻辑路径,但主机到主机层是负责两个在完全不同网络[18]上的主机之间的全程逻辑路径。从另一个角度看,主机到主机层向应用提供了一个到协议簇下一层的接口,使应用不必关心它们的数据实际上是如何被传送的。
可以把这种服务比喻为公司的信件收发室。一个包裹被送到收发室,并附有邮寄要求(平信或隔日送到)。提出邮寄要求的人不需要知道或可能不关心实际是怎样邮寄此包裹的。收发室的工作人员将会安排合适的邮寄方式来满足其要求(送邮局邮寄、FedEx、交给骑自行车横穿城镇送快件的人)。
主机到主机层提供两个主要的服务:TCP和UDP。
1.6.1 TCP
传输控制协议(TCP),向应用提供了可靠的、面向连接的服务,详见RFC793。换句话说,TCP提供了一个类似于点到点的连接。
点到点连接有两个特点:
仅存在一条到达目的地的路径。进入连接的数据包不会丢失,因为数据包惟一可去的地方就是连接的另一端。
数据包到达的顺序与发送顺序相同。
TCP提供了一条看似点到点的连接,虽然实际上这条连接并不存在。TCP利用的Internet层可以提供无连接的、尽力而为转发的服务。这类似于邮政服务。一叠信一旦交给邮递员后,谁也不能保证信件将按照原先叠放的顺序依次送达,也不能保证信件都将在同一天送到,甚至不能保证全部送到。邮政服务仅仅能承诺尽最大努力邮寄这些信件。
同样的,Internet层不保证所有的数据包使用相同的路径,因而也不保证数据包到达时仍旧保持发送时的顺序和间隔或者全部到达。
另一方面,电话呼叫是一个面向连接的服务。数据必须顺序、可靠地到达,否则数据就会作废。像电话呼叫一样,TCP首先必须建立连接,然后是传送数据,当数据传送完成后要拆除连接。
在无连接服务之上,TCP使用了3种基础的机制实现面向连接的服务:
- 使用序列号对数据包进行标记,以便TCP接收服务在向目的应用传递数据之前修正错序的数据包排序。
- TCP使用确认、校验和定时器系统提供可靠性。当接收者按照顺序识别出数据包未能到达或发生错误时,接收者将通知发送者,或者接收者在特定时间内没有发送确认信息,那么发送者就认为在发送结束后数据包没有到达接收方。在这两种情况下,发送者都会考虑重传数据包。
- TCP使用窗口机制调整数据包的流量;窗口机制可以减少因接收方缓冲区满而造成丢失数据包的可能性。
TCP在应用层数据上附加了一个报头,报头包括序列号字段和这些机制的其他一些必要信息,如叫做端口号的地址字段,该字段可以标识数据的源和目标应用程序。为了传送数据,应用数据及附加的TCP报头被封装在IP数据包内。图1-17显示了TCP数据报头字段,示例1-14显示了协议分析器获取的TCP报头信息。
示例1-14 协议分析器显示出的TCP报头
- 源端口(Source Port )和目的端口(Destination Port )——字段长度各为16位,它们为封装的数据指定了源和目的应用程序。像TCP/IP使用其他编号一样,RFC1700描述了所有常用和不常用的端口号。应用程序的端口号加上应用程序所在主机的IP地址统称为套接字(socket)。在网络上套接字惟一地标识了每一个应用程序。
- 序列号(Sequence Number)字段长度为32位,序列号确定了发送方发送的数据流中被封装的数据所在位置。例如,如果本段数据的序列号为1343,且数据段长512个八位组,那么下一数据段的序列号应该为1343+512+1=1856。
- 确认号(Acknowledgment Number)字段长度为32位,确认号确定了源点下一次希望从目标接收的序列号。如果主机收到的确认号与它下一次打算发送(或已发送)的序列号不符,那么主机将获悉丢失的数据包。
- 报头长度(Header Length) 又叫数据偏移量,长度为4位,报头长度指定了以32位字为单位的报头长度。由于可选项字段的长度可变,所以这一字段标识出数据的起点是很有必要的。
- 保留(Reserved)字段长度为6位,通常设置为0。
- 标记(Flag)包括8个1位的标记,用于流和连接控制。它们从左到右分别是:拥塞窗口减少(Congestion Window Reduced,CWR)、ECN-Echo(ECE)、紧急(URG)、确认(ACK)、弹出(PSH)、复位(RST)、同步(SYN)和结束(FIN)。
- 窗口大小(Window Size)字段长度为16位,主要用于流控制。窗口大小指明了自确认号指定的八位组开始,接收方在必须停止传输并等待确认之前发送方可以接收的数据段的八位组长度。
- 校验和(Checksum)字段长度为16位,它包括报头和被封装的数据,校验和允许错误检测。
- 紧急指针(Urgent Pointer)字段仅当URG标记置位时才被使用。这个16位数被添加到序列号上用于指明紧急数据的结束。
- 可选项(Options)字段用于指明TCP的发送进程要求的选项。最常用的可选项是最大段长度,最大段长度通知接收者发送者愿意接收的最大段长度。为了保证报头的长度是32个八位组的倍数,所以使用0填充该字段的剩余部分。
1.6.2 UDP
用户数据报协议(UDP)提供了一种无连接、尽力而为传送的数据包转发服务,详见RFC 768。起初,对应用程序宁愿使用不可靠的转发服务,而不用面向连接的TCP服务,感觉很有疑问。然而UDP的优点是不花时间建立连接,直接发送数据。用UDP代替TCP,可以使发送小数据量的应用取得更好的性能优势。
图1-18中给出了UDP的另一个优点:UDP报头长度远远小于TCP报头长度。UDP报头中的源端口和目的端口字段与TCP完全相同;UDP的长度指明了以八位组为单位的整个段长度。校验和包括整个段,但是不同于TCP,在这里,校验和是可选的;当不使用校验和时,此字段全部设置为0。在示例1-15中显示出协议分析器捕捉到的UDP报头。
示例1-15 协议分析器显示的UDP报头