IP地址
为使计算机连接到网络并收发数据,必需向其分配IP地址。
IP地址分为两类。
IPv4 (Internet Protocol version 4)4字节地址族
IPv6 (Internet Protocol version 6)16字节地址族
IPv4与IPv6的差别主要是表示IP地址所用的字节数,目前通用的地址族为IPv4。 IPv6是为了应对2010年前后IP地址耗尽的问题而提出的标准,即便如此,现在还是主要使用IPv4, IPv6的普及将需要更长时间。
IPv4标准的4字节IP地址分为网络地址和主机(指计算机)地址,且分为A、B、C、D、E等类型。图3-1展示了IPv4地址族,一般不会使用已被预约了的E类地址,故省略。
网络地址分类与主机地址边界只需通过IP地址的第一个字节即可判断网络地址占用的字节数,因为我们根据IP地址的边界区分网络地址,如下所示。
A类地址的首字节范围:0~127
B类地址的首字节范围: 128-191
C类地址的首字节范围:192~223
还有如下这种表述方式。
A类地址的首位以0开始
B类地址的前2位以10开始
C类地址的前3位以110开始
某主机向203.211.172.103和203.211.217.202传输数据,其中203.211.172和203.211.217为该网络的网络地址。所以,“向相应网络传输数据”实际上是向构成网络的路由器(Router)或交换机(Switch)传递数据,由接收数据的路由器根据数据中的主机地址向目标主机传递数据。
端口号
端口号就是在同一操作系统内为区分不同套接字而设置的,因此无法将1个端口号分配给不同套接字。另外,端口号由16位构成,可分配的端口号范围是0-65535。但0-1023是知名端口(Well-known PORT),一般分配给特定应用程序,所以应当分配此范围之外的值。另外,虽然端口号不能重复,但TCP套接字和UDP套接字不会共用端口号,所以允许重复。例如:如果某TCP套接字使用9190号端口,则其他TCP套接字就无法使用该端口号,但UDP套接字可以使用。总之,数据传输目标地址同时包含IP地址和端口号,只有这样,数据才会被传输到最终的目的应用程序(应用程序套接字)。
平时工作和学习中,大家都知道一台计算机的端口号总共有65535个,但一台计算机真的只能建立65535个TCP的连接吗?TCP:(Transmission Control Protocol 传输控制协议) 提供面向连接的、可靠的数据传输。一个完整的TCP连接由四个部分组成:源IP 源端口 <–>目的IP 目的端口 这就是经典的socket四元组。建立一个TCP连接,需要将两端的套接字进行绑定:源IP地址:源端口号 <---->目标IP地址:目标端口号,只要确保绑定的套接字不重复,即可完成一个tcp的连接,由此可见如果端口号不够用了,就不断变换目标IP地址和目标端口号,保证四元组不重复,就能创建很多个TCP的连接,由此可见有人说最多只能创建65535个tcp连接是不正确的。
既然如此,那可以创建tcp的数量有没有限制呢?
1、系统设置对连接数的限制
2、文件描述符对连接数的限制
3、线程对连接数的限制
网络字节序
CPU向内存保存数据的方式有2种,这意味着CPU解析数据的方式也分为2种。
大端序(Big Endian):高位字节存放到低位地址。
小端序(Little Endian):高位字节存放到高位地址。
仅凭描述很难解释清楚,下面通过示例进行说明。
假设在0x20号开始的地址中保存4字节int类型数0x12345678。
大端序CPU保存方式如图3-4所示。
整数0x12345678中, 0x12是最高位字节, 0x78是最低位字节。因此,大端序中先保存最高位,字节0x12 (最高位字节0x12存放到低位地址)。
小端序保存方式如图3-5所示。
先保存的是最低位字节0x78。从以上分析可以看出,每种CPU的数据保存方式均不同。因此,代表CPU数据保存方式的主机字节序(Host Byte Order)在不同CPU中也各不相同。目前主流的Intel系列CPU以小端序方式保存数据。
接下来分析2台字节序不同的计算机之间数据传递过程中可能出现的问题,如图3-6所示。
0x12和0x34构成的大端序系统值与0x34和0x12构成的小端序系统值相同。换言之,只有改变数据保存顺序才能被识别为同一值。图3-6中,大端序系统传输数据0x1234时未考虑字节序问题,而直接以0x12、0x34的顺序发送。结果接收端以小端序方式保存数据,因此小端序接收的数据变成0x3412,而非0x1234。正因如此,在通过网络传输数据时约定统一方式,这种约定称为网络字节序(Network Byte Order),非常简单——统一为大端序。
即,先把数据数组转化成大端序格式再进行网络传输。因此,所有计算机接收数据时应识别
该数据是网络字节序格式,小端序系统传输数据时应转化为大端序排列方式。
回送地址
回送地址(127.x.x.x)是本机回送地址(Loopback Address),即主机IP堆栈内部的IP地址,主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,协议软件立即返回之,不进行任何网络传输。