《图解TCP/IP》阅读笔记(第六章 6.1、6.2)—— 传输层的作用、端口号

第六章 TCP与UDP

TCP与UDP和赫赫威名,在此前几章已略有耳闻。

TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。

首先,我们先来回顾一下传输层的定义。

上一章中提到过,IP中有一个协议字段,用于标识网络层的上一层采用的究竟是那种传输层协议。根据这个协议号,就可以识别IP传输的数据部分究竟是TCP的内容,还是UDP的内容。

同样,TCP与UDP为了标识自己传输的数据部分究竟应该发送给哪个应用,也设定了这样一个编号。这个编号就是端口号。

书中给出了一个例子,大概意思就是,地址就是IP,但是即使知道了地址,却不知道包裹是寄给这家中哪个人的,而端口号就起到这样一个作用:识别传输层的上一层,即应用层中具体是哪个应用接收数据。就好比“姓氏”一般,知道了姓氏,就知道包裹具体要给谁。

此处要提到的一点是,此处的端口是路由器、交换机等设备上网卡的端口有所不同,且一个应用程序可以使用多个端口。

TCP/IP的众多应用协议大多以客户端、服务端的形式运行。作为服务器的程序有必要提前启动,准备接收客户端的请求。而服务端程序,在UNIX系统中叫做守护进程。例如HTTP的服务端程序是httpd(HTTP守护进程),而ssh的服务端程序则是sshd(SSH守护进程)。在UNIX系统中并非需要一个一个的启用这些守护进程,而是启动一个超级守护进程inetd(互联网守护进程)。该进程收到客户端的请求后,会fork新的进程,并转换(exec)为sshd等各个守护进程。

确定一个请求究竟发给那个服务端(守护进程),可以通过所收到的数据包的目标端口号轻松识别。例如,使用TCP请求建立连接时,如果目标端口号为22,则转给sshd;如果是80,则转给httpd。然后,这些守护进程会继续对该连接上的通信传输进行处理。

以下图为例,传输协议的数据被传递给HTTP、TELNET、FTP等应用层协议。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3UU5y7JH-1671352081521)(C:\Users\19041\AppData\Roaming\Typora\typora-user-images\image-20221218115717827.png)]

刚刚讲了讲,传输层的不同之处和作用,那么接下来就要具体讲讲TCP和UDP了。

其实传输层不仅只有这两种协议(想想也不可能),但是其中最具有代表性的协议莫过于TCP和UDP。

首先介绍TCP,TCP面向连接,是一种可靠的流协议。使用TCP发送消息时,虽然可以保证发送的顺序,但仍是犹如没有间隔的数据流发送给接收端。其实行“顺序控制”或者“重发控制”机制,还具备“流控制”、“拥塞控制”等众多功能。

其次是UDP,这是一种不可靠的数据报协议,传输速度通常比TCP快得多。细微的处理会交由上层应用去完成,UDP确保发送消息的大小,但不确保消息一定会送达,因此应用需要根据自己的需求进行重发处理。

这两种协议孰优孰劣,自然难以区分,要根据应用场景的不同选择不同的传输协议。TCP用于在传输层有必要实现可靠传输的情况。而UDP则主要用于那些对高速传输和实时性有较高要求的通信或者广播通信。以通话为例,使用TCP,数据在传输中途丢失则会被重发,这样就难以流畅的传输通话人的声音。但是UDP则不同,即使有部分数据丢失,也只会影响一小部分通话,对于整体的通话过程并无大碍。此外,在多播和广播通信中也要使用UDP,此前所讲的DHCP,和此后要接触的RIP等基于广播的协议,依赖的就是UDP。

此处,书中提到了套接字(Socket)的概念。在使用UDP或者TCP时,会使用到操作系统提供的类库,又称为API(Application Programming Interface,应用编程接口)。

而TCP、UDP的API中,广泛使用到的就是套接字(socket)。其原本由BSD UNIX开发,后被移植到Windows的Winsock以及嵌入式操作系统中。应用可以根据套接字,设置对端的IP地址、端口号,实现数据的发送与接收,见下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8YTARrNk-1671352081522)(C:\Users\19041\AppData\Roaming\Typora\typora-user-images\image-20221218124301935.png)]

6.2 端口号

让我们回顾一下,数据链路中的地址为MAC地址,IP中的地址为IP地址。

前者用来识别同一链路中不同的计算机,后者用来识别TCP/IP网络中互联的主机和路由器。

那么在传输层中有没有类似地址的概念呢?其实我们心中已经有了答案,那就是端口号。

端口号用于识别同一台计算机中进行通信的不同应用程序,因此也被成为程序地址。如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-79UfsA0X-1671352081522)(C:\Users\19041\AppData\Roaming\Typora\typora-user-images\image-20221218152255600.png)]

在一个通信过程中,仅凭目标端口号是远远不够的。书中给出了这样一个场景,见下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vkddCFN8-1671352081523)(C:\Users\19041\AppData\Roaming\Typora\typora-user-images\image-20221218152942141.png)]

客户端A想要与服务器发生通信①和②,其目标端口一致,都是服务器的80号端口。那么服务器如何区分这两个通信过程呢?答案也很简单,根据客户端A的源端口。比如同时打开两个Web浏览器,同时访问服务器上不同的资源。

而图中还有一个通信③,其目标端口与源端口完全一致,这时如何与通信①做区分呢?答案也很简单,根据IP地址就可以了(讲到这仿佛有些戏谑,仿佛前面的内容没怎么看过一样)。

另一种情况,就是IP的地址和源端口一模一样,但协议号不同。这种情况下,也会被认为是两个不同的通信。

这里要说明的意义就是,只有{源IP,目标IP,协议号,源端口号,目标端口号}五元完全一致的,才会被认为是统一通信。通信控制中的IntServ就是如此判断的。

那么,电脑上的应用那么多,端口号如何确定呢?需要人为分配吗?

实际上,端口号的分配有很多种方法。之前我们已经提到一种,就是为什么Http要用80号端口呢?因为这是标准,也叫做静态方法,指每个应用都有其指定的端口号。例如HTTP、TELNET、FTP等广为使用的应用协议中所使用的端口号就是固定的。这些端口号也被称为知名端口号(Well-Known Port Number),其一般由0~1023的数字分配而成,可以查表进行查询。应用程序应当避免使用知名端口号进行既定目的之外的通信,以免产生冲突。

除了知名端口号外,还有一些端口号也被注册过,分布在1024~49151的数字之间。

另一种则是时序分配法,也称作动态分配法,端口号取值为49152~65535。这种情况下,服务端有必要确定监听端口号,但是接受服务的客户端没必要确定端口号。这种方法下,客户端应用程序可以完全不用自己设置端口号,全权交给操作系统进行分配。操作系统的分配按时可以在之前分配号码的基础上加1,这种方式最简单。

根据这种动态分配端口号的机制,即使同一个客户端程序发起多个TCP连接,识别这些连接的五元组也不会完全相同。

按照五元组的说法,不同的传输协议,其实是可以使用相同的端口号的。数据到达IP层后,会先检查IP首部中的协议号,再传给相应协议的模块。如果是TCP则传给TCP,如果是UDP则传给UDP模块去做端口号的处理。

另外,那些知名端口号,则和传输层协议没有关系,只要端口一致,就分配给同一程序。例如,53号端口,无论协议是TCP还是UDP,都会用于DNS服务,而80号端口则会用于HTTP服务。

本篇小结

从本篇文章开始,就正式进入第六章的内容。

本篇简要介绍了什么是传输层,其被设立的目的是为了便于应用层找到通信的具体应用程序。以及点出通信过程中,使用的TCP、UDP有什么不同之处。

之后,也是方便后续的内容,简单提了提什么是端口号,以及如何根据端口号识别应用。最后一部分,讲了讲确定端口号的两种方式:静态分配与动态分配。

本篇的内容并不复杂,记忆点也不多,通读一遍有所了解即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值