TCP/IP知识点:主机到主机层协议
主机到主机层协议
主机到主机层的主要功能是对上层应用程序隐藏网络的复杂性,它告诉上层:“只需将你的数据和说明给我,我将对你的信息进行处理,为发送做好准备。
接下来的几节将介绍该层的两种协议:
● 传输控制协议( TCP );
● 用户数据报协议(UDP )。
另外,我们还将介绍一些重要的主机到主机协议概念,还有端口号。
!注意:别忘了,这仍被视为第4层,第4层可使用确认、排序和流量控制,思科喜欢这一点。
1. TCP
TCP ( Transmission Control Protocol,传输控制协议)接收来自应用程序的大型数据块,并将其划分成数据段。它给每个数据段编号,让接收主机的TCP栈能够按应用程序希望的顺序排列数据段。发送数据段后,发送主机的TCP等待来自接收端TCP的确认,并重传未得到确认的数据段。
发送主机开始沿分层模型向下发送数据段之前,发送方的TCP栈与目标主机的TCP栈联系,以建立连接。它们创建的是虚电路,这种通信被认为是面向连接的。在这次初始握手期间,两个TCP栈还将就如下方面达成-致:在接收方的TCP发回确认前,将发送的信息量。预先就各方面达成一致后,就为可靠通信铺平了道路。
TCP是一种可靠的精确协议,它采用全双工模式,且面向连接,但需要就所有条款和条件达成一致,还需进行错误检查,这些任务都不简单。TCP很复杂,且网络开销很大,这没有什么可奇怪的。鉴于当今的网络比以往的网络可靠得多,这些额外的可靠性通常是不必要的。大多数程序员都使用TCP,因为它消除了大量的编程工作,但实时视频和VoIP使用UDP,因为它们无法承受额外的开销。
●TCP数据段的格式
鉴于上层只将数据流发送给传输层的协议,下面将说明TCP如何将数据流分段,为因特网层准备好数据。因特网层收到数据段后,将其作为分组在互联网络中路由。随后,数据段被交给接收主机的主机到主机层协议,而该协议重建数据流,并将其交给上层应用程序或协议。
图3-4说明了TCP数据段的格式,其中列出了TCP报头中的各种字段。
TCP报头长20 B (在包含选项时为24B ),你必须理解TCP数据段中的每个字段。
○ 源端口发送主机的应用程序的端口号(端口号将在本节后面解释)。
○ 目标端口 目标主机的应用程序的端口号。
○ 序列号-个编号,TCP用来将数据按正确的顺序重新排列(称为排序)重传丢失或受损的数据。
○ 确认号TCP期待接下来收到的数据段。
○ 报头长度TCP 报头的长度,以32位字为单位。它指出了数据的开始位置,TCP 报头的长度为32位的整数倍,即使包含选项时亦如此。
○ 保留总是设 置为零。
○ 编码位/标志用于建 立和终止会话的控制功能。
○ 窗口大小发送方愿意接受的窗口大小,单位为字节。
○ 校验和CRC ( Cyclic Redundancy Check, 循环冗余校验),由于TCP不信任低层,因此检查所有数据。CRC检查报头和数据字段。
○ 紧急仅当设置了编码位中的紧急指针字段时,该字段才有效。如果设置了紧急指针,该字段表示非紧急数据的开头位置相对于当前序列号的偏移量,单位为字节。
○ 选项长度为0或32位的整数倍。也就是说,没有选项时,长度为0。然而,如果包含选项时导致该字段的长度不是32位的整数倍,必须填充零,以确保该字段的长度为32位的整数倍。
○ 数据传递给传输层的 TCP协议的信息,包括上层报头。
下面来看一个从网络分析器中复制的TCP数据段:
你注意到前面讨论的数据段中的各项内容了吗?从报头包含的字段数量可知,TCP 的开销很大。为节省开销,应用程序开发人员可能优先考虑效率而不是可靠性,因此作为一种替代品, 在传输层还定义了UDP。
2. UDP
如果将UDP与TCP进行比较,你将发现前者基本上是一个简化版, 有时称为瘦协议。与公园长凳上的瘦子一样,瘦协议占用的空间不大一在网络中 占用的带宽不多。UDP未提供TCP的全部功能,但对于不需要可靠传输的信息,它在传输信息方面做得相当好,且占用的网络资源更少。( RFC 768详细介绍了UDP。)
在有些情况下,开发人员选择UDP而不是TCP是绝对明智的,例如当进程/应用层已确保了可靠性时。NFS ( Network File System,网络文件系统)处理了自己的可靠性问题,这使得使用TCP既不现实也多余。但归根结底,使用UDP还是TCP取决于应用程序开发人员,而不是想更快地传输数据的用户。
UDP不对数据段排序,也不关心数据段到达目的地的顺序。相反,UDP将数据段发送出去后就不再管它们了。它不检查数据段,也不支持表示安全到达的确认,而是完全放手。有鉴于此,UDP被称为不可靠的协议。这并不意味着UDP效率低下,而只意味着它根本不会处理可靠性问题。
另外,UDP不建立虚电路,也不在发送信息前与接收方联系。因此,它也被称为无连接的协议。
因为假定应用程序会使用自己的可靠性方法,所以UDP不使用。这给应用程序开发人员在开发因特网协议栈时提供了选择机会:使用TCP确保可靠性,还是使用UDP提高传输速度。
因此,牢记UDP的工作原理至关重要,因为如果数据段未按顺序到达(这在IP网络中很常见),它们将被按收到的顺序传递给OSI ( DoD)模型的下一层,这可能使数据极其混乱。另-方面,TCP给数据段排序,以便能够按正确的顺序重组它们,而UDP根本没有这样的功能。
●UDP数据段的格式
图3-5清楚地表明,UDP的开销明显比TCP低。请仔细查看该图,你会注意到UDP在其格式中既没有使用窗口技术,也没有在UDP头中提供确认应答。
了解UDP数据段中的每个字段至关重要,如下。
■ 源端口号发送 主机的应用程序的端口号。
■ 目标端口号目标主机 上被请求的应用程序的端口号。
■ 长度UDP 报头和UDP数据的总长度。
■ 校验和UDP 报头和UDP数据的校验和。
■ 数据上层数据。
与TCP一样, UDP也不信任低层操作并运行自己的CRC。还记得吗, CRC结果存储在FCS( FrameCheck Sequence,帧校验序列)字段中,这就是你能够看到FCS信息的原因。
注意,开销很低!请尝试在UDP数据段中寻找序列号、确认号和窗口大小。你找不到,因为它们根本就不存在!
3.有关主机到主机层协议的重要概念
介绍面向连接的协议( TCP )和无连接协议(UDP)后,有必要对它们做-下总结。表3-1列出了一些有关这两种协议的重要概念,你应牢记在心。
让我们用打电话的例子帮助你理解TCP的工作原理。大多数人都知道,用电话与人通话前,必须首先建立到对方的连接一不管对方 在什么地方。这类似于TCP协议使用的虚电路。如果你在通话期间给对方提供了重要信息,你可能会问“你知道了吗?”或“你明白了吗?”这相当于TCP确认——设计它旨在让你核实。打电话(尤其使用手机)时,人们经常会问“你在听吗?”并说“再见”等词句以结束通话。TCP也执行这些工作。相反,使用UDP类似于邮寄明信片。此时,你无需先与对方联系,而只需写下要说的话并给明信片写上地址,然后邮寄出去。这类似于UDP的无连接模式。由于明信片上的话并非生死攸关,你不需要接收方进行确认。
同样,UDP也不涉及确认。来看另一张图,它包含TCP、UDP及其应用,如图3-6所示。
4.端口号
TCP和UDP必须使用端口号与上层通信,因为端口号跟踪通过网络同时进行的不同会话。源端口号是源主机动态分配的,其值不小于1024。1023及更小的端口号是在RFC 3232 (请参阅www.iana.org )中定义的,该RFC讨论了知名端口号。
对于使用的应用程序没有知名端口号的虚电路,其端口号将依据指定范围随机分配。在TCP数据段中,这些端口号标识了源应用程序(进程)和目标应用程序(进程)。图3-6说明了TCP和UDP如何使用端口号。
对可使用的各种端口号解释如下:
★ 小于1024的端口号为知名端口号,是在RFC 3232中定义的;
★ 上层使用1024和更大的端口号建立与其他主机的会话,而在数据段中,TCP和UDP将它们用
作源端口和目标端口。
接下来的几节,我们将查看显示TCP会话的分析器输出。
●TCP会话:源端口
下面是我的分析器软件捕获的一个TCP会话:
注意,源主机选择了一个端口号,这里为5973。目标端口号为23,它用于将连接的目的( Telnet )告知接收主机。通过查看该会话可知,源主机从范围1024~ 65 535中选择-一个源端口,但它为何要这样做呢?旨在区分与不同主机建立的会话。如果发送主机不使用不同端口号,服务器如何知道信息来自何方呢?
数据链路层和网络层协议分别使用硬件地址和逻辑地址标识发送主机,但TCP和上层协议不这样做,它们使用端口号。
●TCP会话:目标端口
查看分析器的输出时,你有时会发现只有源端口号大于1024,而目标端口号为知名端口号,如下所示:
毫无疑问,源端口号大于1024,但目标端口号为80 (HTTP服务)。必要时,服务器(接收主机)将修改目标端口号。
在上述输出中,一个syn (同步)分组被发送给了目标设备,这告诉远程目标设备,它想建立一个会话。
●TCP会话:对同步分组的确认
下面的输出是对同步分组的确认:
注意,其中包含Ack is valid, 这表明目标设备接受了源端口,并同意建立一条到源主机的虚电路。
同样,服务器的响应表明源端口号为80,而目标端口号为源主机发送的1144。表3-2列出了TCP/IP协议簇常用的应用程序、它们的知名端口号以及它们使用的传输层协议。请务必研究并牢记该表,这很重要。
注意,DNS可使用TCP和UDP,具体使用哪个取决于要做什么。虽然它并非使用这两种协议的唯一种应用程序,但你必须记住它。
、
为了方便广大网络爱好学习者一起学(聚)习(众)交(搞)流(基),特开设思科干货交流群,里面已经上传大量学习资料,欢迎广大网络工程师进群学习!