diff --git a/ch03/README.md b/ch03/README.md index 53fefdb..05b1fce 100644 --- a/ch03/README.md +++ b/ch03/README.md @@ -6,14 +6,14 @@ ### 3.1 分配给套接字的 IP 地址与端口号 -IP 是 Internet Protocol(网络协议)的简写,是为手法网络数据而分配给计算机的值。端口号并非赋予计算机的值,而是为了区分程序中创建的套接字而分配给套接字的端口号。 +IP 是 Internet Protocol(网络协议)的简写,是为收发网络数据而分配给计算机的值。端口号并非赋予计算机的值,而是为了区分程序中创建的套接字而分配给套接字的序号。 #### 3.1.1 网络地址(Internet Address) 为使计算机连接到网络并收发数据,必须为其分配 IP 地址。IP 地址分为两类。 - IPV4(Internet Protocol version 4)4 字节地址族 -- IPV6(Internet Protocol version 6)6 字节地址族 +- IPV6(Internet Protocol version 6)16 字节地址族 两者之间的主要差别是 IP 地址所用的字节数,目前通用的是 IPV4 , IPV6 的普及还需要时间。 @@ -25,7 +25,7 @@ IPV4 标准的 4 字节 IP 地址分为网络地址和主机(指计算机) ![](https://i.loli.net/2019/01/13/5c3ab19174fa4.png) -某主机向 203.211.172.103 和 203.211.217.202 传递数据,其中 203.211.172 和 203.211.217 为该网络的网络地址,所以「向相应网络传输数据」实际上是向构成网络的路由器或者交换机传输数据,然后又路由器或者交换机根据数据中的主机地址向目标主机传递数据。 +某主机向 203.211.172.103 和 203.211.217.202 传递数据,其中 203.211.172 和 203.211.217 为该网络的网络地址,所以「向相应网络传输数据」实际上是向构成网络的路由器或者交换机传输数据,然后由路由器或者交换机根据数据中的主机地址向目标主机传递数据。 #### 3.1.2 网络地址分类与主机地址边界 @@ -41,13 +41,13 @@ IPV4 标准的 4 字节 IP 地址分为网络地址和主机(指计算机) - B 类地址的前2位以 10 开始 - C 类地址的前3位以 110 开始 -因此套接字手法数据时,数据传到网络后即可轻松找到主机。 +因此套接字收发数据时,数据传到网络后即可轻松找到主机。 #### 3.1.3 用于区分套接字的端口号 IP地址用于区分计算机,只要有IP地址就能向目标主机传输数据,但是只有这些还不够,我们需要把信息传输给具体的应用程序。 -所以计算机一般有 NIC(网络接口卡)数据传输设备。通过 NIC 接受的数据内有端口号,操作系统参考端口号把信息传给相应的应用程序。 +所以计算机一般有 NIC(网络接口卡)数据传输设备。通过 NIC 接收的数据内有端口号,操作系统参考端口号把信息传给相应的应用程序。 端口号由 16 位构成,可分配的端口号范围是 0~65535 。但是 0~1023 是知名端口,一般分配给特定的应用程序,所以应当分配给此范围之外的值。 @@ -82,7 +82,7 @@ struct in_addr } ``` -关于以上两个结构体的一些数据类型。 +关于以上两个结构体的一些数据类型: | 数据类型名称 | 数据类型说明 | 声明的头文件 | | :----------: | :----------------------------------: | :----------: | @@ -121,7 +121,7 @@ AF_LOACL 只是为了说明具有多种地址族而添加的。 - 成员 sin_addr - 该成员保存 32 为IP地址信息,且也以网络字节序保存 + 该成员保存 32 位 IP 地址信息,且也以网络字节序保存 - 成员 sin_zero @@ -178,7 +178,7 @@ CPU 保存数据的方式有两种,这意味着 CPU 解析数据的方式也 ![zijiexu.png](https://i.loli.net/2019/01/13/5c3aca956c8e9.png) -因为这种原因,所以在通过网络传输数据时必须约定统一的方式,这种约定被称为网络字节序,非常简单,统一为大端序。即,先把数据数组转化成大端序格式再进行网络传输。 +因为这种原因,所以在通过网络传输数据时必须约定统一的方式,这种约定被称为网络字节序(Network Byte Order),非常简单,统一为大端序。即,先把数据数组转化成大端序格式再进行网络传输。 #### 3.3.2 字节序转换 @@ -195,8 +195,8 @@ unsigned long ntohl(unsigned long); - htons 的 h 代表主机(host)字节序。 - htons 的 n 代表网络(network)字节序。 -- s 代表 short -- l 代表 long +- s 代表两个字节的 short 类型,因此以 s 为后缀的函数用于端口转换 +- l 代表四个字节的 long 类型,所以以 l 为后缀的函数用于 IP 地址转换 下面的代码是示例,说明以上函数调用过程: @@ -246,11 +246,12 @@ Network ordered address: 0x78563412 #### 3.4.1 将字符串信息转换为网络字节序的整数型 -sockaddr_in 中需要的是 32 位整数型,但是我们只熟悉点分十进制表示法,那么改如何把类似于 201.211.214.36 转换为 4 字节的整数类型数据呢 ?幸运的是,有一个函数可以帮助我们完成它。 +sockaddr_in 中需要的是 32 位整数型,但是我们只熟悉点分十进制表示法,那么改如何把类似于 201.211.214.36 转换为 4 字节的整数类型数据呢 ?幸运的是,有一个函数可以帮助我们完成它,该函数将字符串形式的 IP 地址转换为网络字节序形式的 32 位整数型数据。 ```C #include in_addr_t inet_addr(const char *string); +//成功时返回 32 位大端序整数型值,失败时返回 INADDR_NONE ``` 具体示例: @@ -304,7 +305,7 @@ int inet_aton(const char *string, struct in_addr *addr); /* 成功时返回 1 ,失败时返回 0 string: 含有需要转换的IP地址信息的字符串地址值 -addr: 将保存转换结果的 in_addr 结构体变量的地址值 +addr: 保存转换结果的 in_addr 结构体变量的地址值 */ ``` @@ -358,9 +359,10 @@ Network ordered integer addr: 0x4f7ce87f ```c #include char *inet_ntoa(struct in_addr adr); +//成功时返回保存转换结果的字符串地址值,失败时返回-1 ``` -该函数将通过参数传入的整数型IP地址转换为字符串格式并返回。但要小心,返回值为 char 指针,返回字符串地址意味着字符串已经保存在内存空间,但是该函数未向程序员要求分配内存,而是再内部申请了内存保存了字符串。也就是说调用了该函数候要立即把信息复制到其他内存空间。因此,若再次调用 inet_ntoa 函数,则有可能覆盖之前保存的字符串信息。总之,再次调用 inet_ntoa 函数前返回的字符串地址是有效的。若需要长期保存,则应该将字符串复制到其他内存空间。 +该函数将通过参数传入的整数型IP地址转换为字符串格式并返回。但要小心,返回值为 char 指针,返回字符串地址意味着字符串已经保存在内存空间,但是该函数未向程序员要求分配内存,而是再内部申请了内存保存了字符串。也就是说调用了该函数后要立即把信息复制到其他内存空间。因为,若再次调用 inet_ntoa 函数,则有可能覆盖之前保存的字符串信息。总之,再次调用 inet_ntoa 函数前返回的字符串地址是有效的。若需要长期保存,则应该将字符串复制到其他内存空间。 示例: @@ -434,7 +436,7 @@ addr.sin_port = htons(atoi(serv_port)); //基于字符串的IP地址端口号 2. **通过 IPV4 网络 ID 、主机 ID 及路由器的关系说明公司局域网的计算机传输数据的过程** - 答:网络ID是为了区分网络而设置的一部分IP地址,假设向`www.baidu.com`公司传输数据,该公司内部构建了局域网。因为首先要向`baidu.com`传输数据,也就是说并非一开始就浏览所有四字节IP地址,首先找到网络地址,进而由`baidu.com`(构成网络的路由器)接收到数据后,传输到主机地址。比如向 203.211.712.103 传输数据,那就先找到 203.211.172 然后由这个网络的网关找主机号为 172 的机器传输数据。 + 答:网络ID是为了区分网络而设置的一部分IP地址,假设向`www.baidu.com`公司传输数据,该公司内部构建了局域网。因为首先要向`baidu.com`传输数据,也就是说并非一开始就浏览所有四字节IP地址,首先找到网络地址,进而由`baidu.com`(构成网络的路由器)接收到数据后,传输到主机地址。比如向 203.211.712.103 传输数据,那就先找到 203.211.172 ,然后由这个网络的网关找主机号为 172 的机器传输数据。 3. **套接字地址分为IP地址和端口号,为什么需要IP地址和端口号?或者说,通过IP地址可以区分哪些对象?通过端口号可以区分哪些对象?** @@ -450,7 +452,7 @@ addr.sin_port = htons(atoi(serv_port)); //基于字符串的IP地址端口号 5. **计算机通过路由器和交换机连接到互联网,请说出路由器和交换机的作用。** - 答:路由器和交换机完成外网和本网主机之间的数据交换。 + 答:路由器表示连接到互联网的网络 ID,用于在不同网络间转发数据。交换机用于组织一个局域网内部的主机,局域网内部的主机可以通过交换机直接通信。如果局域网内的主机想要和其他网络的主机通信,需要通过路由器转发到目的网络,接收到的其他网络发来的数据先通过路由器接收,再由路由器根据主机号转发到交换机寻找具体的主机。 6. **什么是知名端口?其范围是多少?知名端口中具有代表性的 HTTP 和 FTP 的端口号各是多少?**