总的来说,在读完第一章、第四章和第二章部分后这本书给我的感觉就一个字:细。能够对我知道的和不知道的所有知识点全部一一讲述,因此个人感觉这本书适合掌握一定的相关知识但不够系统的人对unix网络方面进行知识串联;也适合急需某一方面比如第四章TCP传输的socket应用,但相关知识薄弱,可以将该书作为工具书籍来按照书上步骤先跑起来。
写该文章有两个目的:1.文章主要针对看书但又基础比较薄弱的人解读部分要点。2.整理学习内容
第一章主要讲了一些关于unix网络的相关概念是后面章节的基础,另外通过一个基础的时间获取服务程序案例来告诉我们网络编程的就是20多行核心代码的补充和变式,让我们对网络编程有个直观了解。
该章节通过OSI层级图来向我们展示了在C/S(客户端/服务器)模式下数据的传输方式是用户进程(应用层)->TCP(传输层)->IP(网络层)->以太网驱动程序(数据链路层、物理层)自上而下一层层封装打包最后传输到服务器端,服务器端就是反过来自下而上一层层拆包去头最后在应用层的服务器接收到数据。对OSI模型不了解的人可以去百度一下,我以后有时间也会整理出来将连接贴上来。
该章节需要了解的一个概念是POSIX:可移植操作系统接口。这种接口的目的就是符合该接口的代码可以在不同支持该接口的硬件设备上运行,极大的提高了兼容性。
首先我们可以看到一个可以运行的简单网络客户端程序秩序要20多行,确实很简洁。、
针对代码,第8行不太好理解,argc是main函数的参数,表示运行main函数可以有的参数个数,该历程的argv表示需要输入的服务器点分十进制网络地址(e.g 1.1.1.1),至于argc必须等于2,是因为除了网络地址还有一个参数是./filename,就是执行可执行文件。
第10、11行,socket函数意思就是创建socket程序,至于socket是什么后续会讲,现在可以理解为可以通过它来进行网络通信。我们创建好socket返回一个socket句柄(可以理解为socket的标识),里面的参数不理解就可以当做固定搭配。11行就是书中作者自己写的一个报错程序(其实就是一个另类的printf),包括后面的err_相关的函数都是如此。
12行bzero程序很好理解,就是讲结构体里内容全部初始化为0.
13、14、15行都是对servaddr这个结构体进行配置,参数不理解没关系,后面会讲到,没必要密切关注这些参数,重点在如何去写一个socket的结构上。其中htons函数是讲主机字节序列转换为网络字节序列,也就是从我们能看懂的13转换为网络通用的13的一个格式转化,而数字13就特指获取时间指令。15行是讲输入的点分十进制转换为二进制的函数,也就是IP地址格式转化。
17行就是我们配置好参数后通过socket句柄和servaddr结构体参数去连接服务器。
19-23行read就是读取从服务器传回的时间信息,fputs就是将信息输出到屏幕上(stdout标准输出)。
另外在书中第8页下面译者注写了网络传输的过程和OSI层级的关系(建议好好读),我们需要知道的缩写词表示的意思。PUD:协议数据单元(不同层的PUD表示意思不同);SDU:服务数据单元;MSS:最大分节大小;MTU:最大传输单元。
1.3节很简单当我们理解了前面代码,对比两者代码就会发现不管是IPV4还是IPV6代码结构是不会变化的。不清楚IPV4与IPV6区别的可自行百度。
这个章节主要讲述了包裹函数的重要性,以及书中首字母大写表示功能相同的包裹函数。
与1.2节呼应,客户端发送时间请求,服务器端如何去相应并且处理的。我们可以看出两者程序有很多相像的地方。
10行就是socket的创建,不过可以发现这里使用了包裹函数,将错误处理放在了包裹函数里面,使得代码更加简洁。
15、16行不同的是服务器在创建完socket配置完结构体后使用bind和listen函数,一个是配置绑定,一个是用来监听,返回一个listenfd表示服务器全部配置完毕可以开始运行。
18行accpet函数就是接收客户端消息的函数,该函数运行表示服务器运行,阻塞在这里等待客户端传过来消息才继续进行下面步骤。
19、21行一个是snprintf指定将时间信息%.24s(最多24位)的格式放入buff里,然后再通过write函数返回传输给客户端。
14页中间小字部分比较了不同函数的用法,和那个更安全(可以读读)。
不了解的一定要好好读读,了解OSI模型。