《Linux高性能服务器编程》学习总结——TCP/IP协议族

Posted torrance

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Linux高性能服务器编程》学习总结——TCP/IP协议族相关的知识,希望对你有一定的参考价值。

  在学长的推荐下,我用了大约半个月的时间学习了游双老师的《Linux高性能服务器编程》一书。通读此书,感觉这本书在知识广度上已经很足,对网络协议与编程方面的基础知识栈都有讲解,语言也比较通俗易懂,确是一本对于有一定网络基础也想继续深入学习的同学的好书,但由于篇幅有限,对于部分知识点的讲解没有深入。

  本书共分为三大部分:第1章到第4章主要讲了常用的TCP/IP协议,以及其通信过程,为后面的网络编程打好基础;第5到第15章共用了11章的篇幅讲述了高性能服务器的各个主要方面,其中分为了四个小部分,API介绍、高性能服务器框架、I/O单元和逻辑单元;第16章到第17章讲如何从系统的角度优化和检测服务器性能。

  下面我就逐章总结一下本书的所有重点知识。

第一章      TCP/IP协议族

  TCP/IP协议族是目前世界上使用最广,也是最重要的协议系统,其自低而上分别是:数据链路层,网络层,传输层和应用层。

  数据链路层上有两个常用的协议,ARP协议与RARP协议,其中RARP协议一般仅用于网络上的无盘工作站,由于没有存储介质,无盘工作站无法记住自己的IP地址,所以可以利用网卡上的物理地址向服务器查询自身的IP地址。

  ARP协议最为重要,他能实现任意网络层地址到任意物理地址的转换,不过一般只是IP地址到MAC地址的转换。其工作原理是:主机向自己所在的网络广播一个ARP请求,该请求包含目标机器的网络地址,而当其余主机收到这个请求时,只有被请求的目标主机会回应一个ARP应答,其中包含了自己的物理地址。

  ARP请求/应答报文内容共28字节,加上以太网首部14字节和尾部CRC4字节,共46字节。但是在以太网传播的报文段最低为64字节,所以需要在帧的末尾补0。

 技术分享图片

 

  其中,硬件类型值为1,表示MAC地址,协议类型表示要映射的协议地址类型,值为0x0800,表示IP地址,操作字段即op字段有四种取值,1为ARP请求,2位ARP应答,3为RARP请求,4为RAPR应答。

  网络层是整个TCP/IP协议栈中承上启下的一层,它实现了数据包的选路和转发。在广域网中,相互通信的两台主机之间一般并没有直接连接,而是通过多个中间的路由器相连,所以网络层的任务就是选择这些中间点来确定通信路径,同时,网络层对于上层是透明的,即在传输层上来看,通信双方就是直接相连的。

  在网络层上,最核心的协议就是IP协议,在第二章中会详细讲解。此外,还有ICMP协议,他是IP协议的重要补充,主要用于网络连接的检测,分为两大类,差错报文和查询报文。其首部包括1字节的类型,1字节的代码,2字节的检验和,其余为报文内容,根据首部的不同而异。

  传输层为应用程序封装了一条端到端的逻辑通信链路,主要包含三个协议:TCP、UDP和SCTP,一般我们只讨论前两种。TCP协议为应用层提供可靠的、面向连接的和基于流的服务,TCP协议使用了超时重传、数据确认等方式来确保数据包被正确地发送到目的端。TCP是基于流的,基于流的数据没有边界限制,它源源不断地从通信的一段流入另一端,发送端可以逐个字节地向数据流中写入数据,接收端也可以逐个字节地读出。而UDP协议则恰恰相反,他是无连接,不可靠和基于数据报的服务,这意味着UDP协议无法保证数据从发送端正确地传送到目的端,如果在中途丢失,则UDP只是简单地通知应用程序发送失败,因此,使用UDP的应用程序通常要自己处理数据确认、超时重传等逻辑。UDP是基于数据报的服务,每个UDP数据报都有一个长度,接收端必须以该长度为最小单位将其所有内容一次性读出,否则数据将被截断。

  应用层上就应该处理应用程序的逻辑,其余三层在内核空间实现,而应用层需要在用户空间实现。应用层的协议非常多,比如:telnet、http、DNS、OSPF等。

  DNS是一套分布式的域名系统,我们平时在使用域名访问机器时,其实本质都是访问对方主机在网络上对应的唯一的IP地址,但是为什么我们使用域名也可以访问呢。我们在输入域名的同时,主机会向DNS服务器发送一个DNS请求报文,意思就是询问对方这个域名对应的IP地址是多少,而DNS服务器是都存放着大量机器名和IP地址的映射,而且是动态更新的,所以主机由此知道目的主机的IP地址。对于DNS解析,一共有两种查询方式,迭代查询和递归查询,这两者的区别是:迭代查询是主机A向服务器B发起DNS查询请求,但是服务器B不知道这个域名的IP地址,则他向主机A返回另外一个服务器C的IP地址,让主机A继续去向服务器C查询,也就是说在这种查询模式下,服务器是不负责任的,都是由主机发起查询请求;而递归查询不同,若服务器B是递归查询模式,那么对于主机A的查询请求,它会全权代理,如果自己不知道目的主机的IP地址,它会继续向上级DNS服务器查询,直到查到了IP地址再将其返回给主机A。在Linux中,DNS服务器的地址在/etc/resolv.conf文件中。

以上是关于《Linux高性能服务器编程》学习总结——TCP/IP协议族的主要内容,如果未能解决你的问题,请参考以下文章

《Linux高性能服务器编程》学习总结——IP协议详解

《Linux高性能服务器编程》学习总结——Linux网络编程基础API

《Linux高性能服务器编程》学习总结——信号

《Linux高性能服务器编程》学习总结(十三)——多进程编程

《Linux高性能服务器编程》学习总结——Linux服务器程序规范

《Linux高性能服务器编程》学习总结——高级I/O函数