WIN32汇编语言教程:第16章 TCP/IP和网络通信 · 16.1 网络基础知识(3)
图16.5 IP地址和子网掩码例二
有了子网掩码以后,源计算机将目标计算机的IP地址和自身的子网掩码进行and运算,如果得到的网络号和自身所属的网络号不同的话,就意味着目标计算机不在同一个子网中。这时为数据帧设置目标主机的MAC地址是无法让它“听”到的,于是计算机将数据帧的目标MAC地址设置为网关的MAC地址,这样路由器将接收到这个数据帧,路由器一般用来连接多个子网,它以同样的方法判断目标计算机是否位于其中一个子网上,是的话则向这个子网以目标主机的MAC地址发送数据帧,否则根据路由表的设置将数据帧发送到另一个合适的路由器上,由此传递一直到找到目标主机为止。
2. 端口
曾经有人问过这样一个问题:如果开了两个浏览器窗口去浏览同一个网站的不同页面,那么这两个浏览器窗口的发送方IP地址和接收方的IP地址都是一样的,计算机如何分辨数据是属于哪个浏览器窗口的呢?这就涉及协议复用的问题,如果协议不能复用的话,那么它在同一时刻就只能为一个进程服务。
为此,TCP/IP协议提出了协议端口的概念,协议端口用于标识通信的进程,这样就可以让使用同一个IP地址的不同进程通过不同的端口号对IP地址进行复用,协议端口是在传输层的TCP和UDP协议中实现的,这样就使传输层提供了同时为不同进程提供通信的能力,在其他层次的其他协议中并没有端口的概念。
端口号用一个16位的整数来表示,所以从理论上讲,可以同时有65 536个进程使用同一IP地址进行通信,由于传输层的TCP协议和UDP协议是两个完全独立的模块,两者的工作是互不相干的,所以TCP和UDP各自的端口号也相互独立,一个进程使用TCP协议的某个端口号并不影响另一进程使用UDP协议的同名端口号,但是同一协议的同一端口号无法被两个进程同时使用。
大部分应用层上的协议都定义了自己使用的默认端口号(但这并不意味着必须使用这个端口号),另外,一些服务程序(如SQL Server,Oracle数据库与Windows的终端服务等)也使用固定的端口号。表16.2中列出了一些常用协议和服务程序使用的端口号,详尽的已分配端口号列表可以参考RFC 1700。
表16.2 常用协议和应用程序使用的默认端口号
协议或应用程序 | TCP端口号 | UDP端口号 |
FTP | 21 | |
Telnet | 23 | |
SMTP | 25 |
协议或应用程序 | TCP端口号 | UDP端口号 |
HTTP | 80 | |
POP3 | 110 | |
DNS查询 | 53 | |
TFTP协议 | 69 | |
NetBIOS名字服务 | 137 | |
NetBIOS数据包服务 | 138 | |
SQL Server数据库 | 139、1433 | |
Oracle数据库 | 1521 |
3. 字节顺序
TCP/IP协议是一组开放的协议,它被设计用来在不同的计算机平台之间进行通信,所以在协议的实现细节中不能包括与特定平台相关的东西,凡是与平台相关的都需要转换为规定的格式,其中最主要的就是对字节顺序的处理。
不同CPU对字节顺序的处理方式是不一样的,当数据包在基于这些处理器的平台上传输时,这一点可能会引发一些问题。CPU对字节顺序的处理方式有两种:大尾方式(big Endian)和小尾方式(little Endian)。在大尾方式中,数据的高字节被放置在连续存储区的首位,比如一个32位的16进制数12345678h在内存中的存放方式是12h,34h,56h,78h,同样,IP地址192.168.0.1在内存中的存放方式是192,168,0,1;而在小尾方式中,数据的低字节被放置在连续存储区的首位,上面的数据在内存中的存放方式变为78h,56h,34h,12h以及1,0,168,192。Intel 80x86系列处理器和DEC VAX处理器使用的是小尾方式(所以我们常常看到内存中的多字节数是倒过来放置的),而Motorola的680x0和其他大部分的RISC芯片都使用大尾方式。
大尾和小尾方式各有好处,不同的处理器采用不同的方式本身无可厚非,但是要在它们之间进行通信的话就必须选定其中一种方式当做标准,否则会造成混淆,比如某个采用Intel CPU的计算机要向某个采用Motorola CPU的计算机的0100h号端口发送数据,它按照自己的字节处理顺序在TCP首部填入代表端口号的数据00h,01h(字节流按小尾方式排列),而接收方收到后却按照自己的方式理解为0001h端口,那就成问题了。
TCP/IP协议统一规定使用大尾方式传输数据(也称Internet顺序),非常遗憾的是,这与Intel 80x86系列处理器使用的方式不同,所以在80x86平台下的WinSock编程中,当使用IP地址和端口号等参数时,必须首先将它们转换为Internet顺序。
上页:第16章 TCP/IP和网络通信 · 16.1 网络基础知识(2) 下页:第16章 TCP/IP和网络通信 · 16.2 WinSock接口(1)