强推Linux高性能服务器编程, 真的是后端开发技术提升, 沉淀自身不容错过的一本经典书籍

这篇具有很好参考价值的文章主要介绍了强推Linux高性能服务器编程, 真的是后端开发技术提升, 沉淀自身不容错过的一本经典书籍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

第1章 TCP/IP协议

1.1 TCP/IP协议族体系结构以及主要协议

1.1.1 数据链路层

1.1.2 网络层

1.1.3 传输层

1.1.4 应用层

1.2 封装

1.3 分用

1.5 ARP协议工作原理

1.5.1 以太网ARP请求/应答报文详解

1.5.2 ARP高速缓存的查看和修改

1.5.3 使用tcpdump观察ARP通信过程所得结果如下


  • 本篇核心关键所在不在于是跟大家分享多少知识点,  而在于推荐大家阅读这本书籍。
  • 小杰不是打广告,这本书小杰研读部分之后发现真实的是一本经典数据,文章不仅仅只是枯燥乏味的介绍网络基础知识和僵硬的介绍网络编程
  • 而是把很多的系统调用细节知识点通过代码实际案例来解释,前后连贯,先打基础后通过代码前后呼应, 将学到的基础知识落到实处上去.  
  • 真的是一本特别经典的书籍,不是虚吹,说再多都没啥用,小杰附上百度云盘链接一份,感兴趣的兄弟可以获取哈.
  • 链接:https://pan.baidu.com/s/1FFveRbZDoVXr8ZSwhVPWNw?pwd=kczf 
    提取码:kczf

第1章 TCP/IP协议

1.1 TCP/IP协议族体系结构以及主要协议

强推Linux高性能服务器编程, 真的是后端开发技术提升, 沉淀自身不容错过的一本经典书籍

TCP/IP协议栈是一个四层协议, 由下而上分别是数据链路层, 网络层, 传输层, 应用层, 上层协议使用下层协议提供的服务.  下三层处在内核态中, 应用层处在用户空间中.

1.1.1 数据链路层

链路层功能: 屏蔽物理层的电气差异, 为上层提供统一服务接口

数据链路层实现了网卡接口的网络驱动程序, 处理数据在不同的物理媒介上的传输

不同的物理网络具有不同的电气特性,网络驱动程序隐藏了这些细节,为上层协议提供一个统一的接口。    下层协议为上层提供统一的接口服务, 隐藏屏蔽掉物理层的不同电气差别.

链路层常用协议: ARP协议 (地址解析协议), RARP协议(逆地址解析协议)

功能: ARP 将IP地址转换为物理MAC地址.    RARP将MAC地址转换为IP地址 

强推Linux高性能服务器编程, 真的是后端开发技术提升, 沉淀自身不容错过的一本经典书籍

在网络层使用IP地址唯一标识一台主机, 在链路层使用MAC地址唯一标识一台主机

因此网络层必须先将目标机器的IP地址转化成其物理地址,才能使用数据链路层提供的服务

1.1.2 网络层

网络层功能:网络层实现数据包的选路和转发

通常使用众多分级的路由器来连接分散的主机或LAN (局域网), 往往路由器就作为局域网的网关. (借助海关来理解).   每一个路由器都相当于是一个中间结点.

网络层的任务就是选择这些中间节点(路由),以确定两台主机之间的通信路径. 

网络层对 上层协议隐藏了网络拓扑连接的细节,使得在传输层和网络应用程序看来,通信的双方是直接相连的。     (为何要分层, 优势出来了, 不同层处理不同的通信细节问题, 分化分工, 使得问题简化, 下层协议为上层协议提供简单易用的接口, 隐藏下层处理的细节问题

网络层重要协议:IP协议,  ICMP协议  (探路小兵, 主要用来检测连接的)

IP协议根据数据包的目的IP地址来决定如何投递它,如果数据包不能直接发送给目标主机,那么IP协议就为它寻找一个合适的下一跳(next hop)路由器,并将数据包交付给该路由器来转发

数据包是在网络环境中, 一跳一跳的传输. TTL数据包的最长生存时间, 单位也是hop, 跳过TTL还未到达目标主机, 就默认发送失败, 丢弃数据包了, 并且发送ICMP差错报文给源端.

强推Linux高性能服务器编程, 真的是后端开发技术提升, 沉淀自身不容错过的一本经典书籍

ICMP报文分为差错报文 (回应网络错误) eg: 上述的数据包不可达(3), 重定向(5)

查询报文(ping查询目标是否可达, 网络是否连接)(8),  所以存在类型来区分他们.

ICMP报文还使用8位代码字段来进一步细分不同的条件

比如重定向报文使用代码值0表示对网络重定向,代码值1表示对主机重定向

ICMP报文使用16位校验和字段 对整个报文(包括头部和内容部分)进行循环冗余校验(Cyclic Redundancy Check,CRC),以检验报文在传输过程中是否损坏

1.1.3 传输层

传输层只管端到端的传输, 传输层只关心通信的起始端和目的端,而不在乎数据包的中转过程。

在传输层看来, 两端好似是直接通信的, 实际上中间的中转细节是由网络层处理的   (下层对上层隐藏细节,让上层协议变得尽可能看起来很简单.)

强推Linux高性能服务器编程, 真的是后端开发技术提升, 沉淀自身不容错过的一本经典书籍

实线箭头表示TCP/IP协议族各层之间的实体通信 (数据包确实是沿着这些线路传递的),而水平的虚线箭头表示逻辑通信线路.

该图中还附带描述了不同物理网络的连接方法。可见,数据链路层(驱动程序)封装了物理网络的电气细节

传输层则为应用程序封装了一条端到端的逻辑通信链路,它负责数据的收发、链路的超时重连等

下层都是在为上层提供服务, 提供便捷, 隐藏细节. 

传输层重点协议: TCP, UDP.

TCP是可靠传输协议, 面向连接, 基于流.

可靠来源: 超时重传, 排序号, 确认应答等可靠机制

使用TCP协议通信的双方必须先建立TCP连接, 并在内核中为该连接维持一些必要的数据结构,比如连接的状态、读写缓冲区,以及诸多定时器等.    (超时重传, 确认应答这些机制的实现必然携带着一些内核数据结构. )

当通信结束时,双方必须关闭连接以释放这些内核数据。 ( 连接关闭细节,内核数据结构的释放, 避免内存泄漏 )

UDP协议(User Datagram Protocol,用户数据报协议)则与TCP协议完全相反,它为应用层提供不可靠、无连接和基于数据报的服务

不可靠是因为什么?   因为如果数据在中途丢失,或者目的端通过数据校验发现数据错误而将其丢弃,则UDP协议只是简单地通知应用程序发送失败     (不会重传, 不会确认应答. 所以不可靠)

所以UDP传输的使用往往需要自己处理数据确认、超时重传等逻辑  (自定义UDP可靠传输协议.在应用层书写)

UDP是无连接的, 所以每一次传输数据都需要指定对端的地址 ip + port

基于数据报的服务,是相对基于流的服务而言的。每个UDP数据报都有一个长度,接收端必须以该长度为最小单位将其所有内容一次性读出,否则数据将被截断     

数据报传输,每次都按照一个包裹传输, 包裹为最小传输单位, 大于包裹数据截断

1.1.4 应用层

应用层负责处理应用程序的逻辑                                       (用户空间应用程序)

数据链路层、网络层和传输层负责处理网络通信细节       (内核数据结构, 稳定, 安全, 高效)

?为啥不把应用层服务也全部放入到内核态中                  (逻辑众多,会使内核变得非常庞大)

少数服务器程序是在内核中实现的?                                 (省去拷贝的代价, 提高效率,但是代码逻辑复杂, 不便于移植,书写应用)

应用层重点协议,应用程序列举

  1. ping是应用程序,而不是协议,前面说过它利用ICMP报文检测网络连接,是调试网络环境的必备工具
  2. DNS(Domain Name Service,域名服务)协议提供机器域名到IP 地址的转换,我们将在后面简要介绍DNS协议

应用层协议(或程序)可能跳过传输层直接使用网络层提供的服务,比如ping程序

应用层协议(或程序)通常既可以使 用TCP服务,又可以使用UDP服务,比如DNS协议。

我们可以通 过/etc/services文件查看所有知名的应用层协议,以及它们都能使用哪些传输层服务

1.2 封装

前文一直都在说上层协议使用下层协议提供的服务, 但是究竟是如何使用上的呢?  封装

应用程序数据在发送到物理网络上之前, 将沿着内核协议栈从上往下依次传递  (封装, 封包)

每层协议都将在上层数据的基础上加上自己的头部信息(有时还包括尾部信息),以实现该层的功能, 这个过程就称为封装

强推Linux高性能服务器编程, 真的是后端开发技术提升, 沉淀自身不容错过的一本经典书籍

 每一层都可以进行DDOS攻击.  洪水猛兽.  网络层(可以不断发送连接请求, 或者不断发送fin包.)

DDOS很有意思, 而且暂时没有完全的解决方案, 大致做法就是, 不断地发送无效请求, 占据服务器, 让真正需要使用服务器地人无法建立连接, 或者无法使用.     

解决方法:前面放一台大型地壁垒机器, 过滤无效请求.        (扯多了, 插曲)

经过TCP封装后的数据称为TCP报文段(TCP message segment), 或者简称TCP段。

TCP协议为通信双方维持一个连接,并且在内核中存储相关数据          (内核数据结构:属于内核协议栈)

强推Linux高性能服务器编程, 真的是后端开发技术提升, 沉淀自身不容错过的一本经典书籍深入内核协议栈数据结构去看这个封装过程.   

发送地时候是 tcp header + tcp 内核sendbuffer   接收地时候是   tcp header + tcp 内核recvbuffer

send + write数据, 是先写到内核协议栈的传输层的tcp sendbuffer中, 然后经有内核协议栈层层向下封装, 经由网卡接口驱动程序将其放到物理网络传输层 (网线, 电气传输)

经过UDP封装后的数据称为UDP数据报(UDP datagram)。UDP 对应用程序数据的封装与TCP类似。不同的是,UDP无须为应用层数据保存副本,因为它提供的服务是不可靠的.     (不保存副本在内核态意味着不可靠, 不考虑重传的问题)

当一个UDP数据报被成功发送之后,UDP内核缓冲区中的该数据报就被丢弃了。如果应用程序检测到该数据报未能被接收端正确接收,并打算重发这个数据报,则应用程序需要重新从用户空间将该数据报拷贝到UDP内核发送缓冲区中。

经过IP封装后的数据称为IP数据报(IP datagram)

经过数据链路层封装的数据称为帧(frame)。传输媒介不同,帧 的类型也不同

强推Linux高性能服务器编程, 真的是后端开发技术提升, 沉淀自身不容错过的一本经典书籍帧才是最终在物理网络上传送的字节序列 

1.3 分用

当帧到达目的主机时,将沿着协议栈自底向上依次传递。各层协议依次处理帧中本层负责的头部数据,以获取所需的信息,并最终将 处理后的帧交给目标应用程序。这个过程称为分用

强推Linux高性能服务器编程, 真的是后端开发技术提升, 沉淀自身不容错过的一本经典书籍

上层协议那么多, 所以分用的一个核心问题在于如何知道分用后应该交付给哪个上层协议.

掐去头部之后的身子应该交付给谁? 

每一层的头部中都会存在这样一个字段可以标识上层协议进行交付

eg : IP协议, ARP协议, RAPR协议都使用帧传输数据,所以帧的头部需要提供某个字段(具体情况取决于帧的类型)来区分它们,帧给出的是帧头部的类型字段进行区分

eg : 以太网帧类型字段的值为0x800,则帧的数据部分为IP数据报

同样,因为ICMP协议、TCP协议和UDP协议都使用IP协议,所以 IP数据报的头部采用16位的协议(protocol)字段来区分它们。

TCP报文段和UDP数据报则通过其头部中的16位的端口号(port number)字段来区分上层应用程序。所有知名应用层协议使用的端口号都可在 /etc/services 文件中找到。

帧通过上述分用步骤后,最终将封装前的原始数据送至目标服务

1.5 ARP协议工作原理

主机向自己所在的网络广播一个ARP请求,该请求包含目标机器 的网络地址。此网络上的其他机器都将收到这个请求,但只有被请求 的目标机器会回应一个ARP应答,其中包含自己的物理地址

核心原理: 广播, 目标MAC ff:ff:ff:ff:ff:ff       同网段的所有主机广播, 对比发现ip等于目标ip的机器,填写自己的MAC物理地址并且发送ack应答包

1.5.1 以太网ARP请求/应答报文详解

强推Linux高性能服务器编程, 真的是后端开发技术提升, 沉淀自身不容错过的一本经典书籍

硬件地址长度字段和协议地址长度字段,顾名思义,其单位是字节。对MAC地址来说,其长度为6;对IP(v4)地址来说,其长度为 4。

操作字段指出4种操作类型:ARP请求(值为1)、ARP应答(值 为2)、RARP请求(值为3)和RARP应答(值为4)。

最后4个字段指定通信双方的以太网地址和IP地址。发送端填充除目的端以太网地址外的其他3个字段,以构建ARP请求并发送之。接 收端发现该请求的目的端IP地址是自己,就把自己的以太网地址填进 去,然后交换两个目的端地址和两个发送端地址,以构建ARP应答并返回之(当然,如前所述,操作字段需要设置为2)。

1.5.2 ARP高速缓存的查看和修改

通常,ARP维护一个高速缓存,其中包含经常访问(比如网关地址)或最近访问的机器的IP地址到物理地址的映射。这样就避免了重复的ARP请求,提高了发送数据包的速度。

Linux下可以使用arp命令来查看和修改ARP高速缓存。

  1. arp  -a 是查看ARP 缓存内容   
  2. arp  -d  ip   是删除ARP缓存内容
  3. arp  -s  ip  MAC  是添加  ARP缓存内容

1.5.3 使用tcpdump观察ARP通信过程所得结果如下

强推Linux高性能服务器编程, 真的是后端开发技术提升, 沉淀自身不容错过的一本经典书籍 注意点:文章来源地址https://www.toymoban.com/news/detail-467994.html

  1. ARP请求和应答是从以太网驱动程序发出的,而并非像图 中描述的那样从ARP模块直接发送到以太网上,所以我们将它们用虚 线表示,这主要是为了体现携带ARP数据的以太网帧和其他以太网帧 (比如携带IP数据报的以太网帧)的区别。
  2. 路由器也将接收到以太网帧1,因为该帧是一个广播帧。不 过很显然,路由器并没有回应其中的ARP请求,正如前文讨论的那样

到了这里,关于强推Linux高性能服务器编程, 真的是后端开发技术提升, 沉淀自身不容错过的一本经典书籍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【阅读笔记】Linux 高性能服务器编程

    原文地址以及最新代码参考:https://github.com/EricPengShuai/Interview/tree/main/Linux Ch.5 Linux 网络编程基础 API 5.1 socket 地址 API 5.1.1 主机字节序和网络字节序 大端字节序(网络字节序):高位低地址 小端字节序(主机字节序):高位高地址 参考代码:5-1byteorder.cpp 一般网络编程中,发

    2024年02月06日
    浏览(50)
  • 《Linux高性能服务器编程》笔记04

    本文是读书笔记,如有侵权,请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 I/O复用使得程序能同时监听多个文件描述符,这对提高程序的性能至关重要。通常,网络程序在下列情况下需要使用I/0复用技术: 客户

    2024年01月21日
    浏览(74)
  • 《Linux高性能服务器编程》笔记02

    参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 Linux提供了很多高级的I/O函数。它们并不像Linux基础I/O函数(比如open和read) 那么常用(编写内核模块时一般要实现这些I/O函数),但在特定的条件下却表现出优秀的性 能。本章将讨论

    2024年01月21日
    浏览(56)
  • Linux高性能服务器编程——学习笔记①

    第一章有一些概念讲的很好,值得好好关注一下!!! 1.1 主要的协议 1.1.1 数据链路层 ​ 数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介(以太网、令牌环)上的传输。 ​ 常用的协议有两种: ARP协议(Address Resolve Protocol,地址解析协议) RARP(Reverse

    2024年01月20日
    浏览(62)
  • Linux高性能服务器编程——ch10笔记

    信号是由用户、系统或者进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常。 :::tips int kill(pid_t pid, int sig); ::: kill函数:一个进程给其他进程发送信号的API。 sig一般大于0,如果设为0则表示不发送信号,可以用来检测进程或进程组是否存在。由于进程P

    2024年02月06日
    浏览(42)
  • linux系统下如何使用nginx作为高性能web服务器

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开

    2024年04月14日
    浏览(49)
  • Linux高性能服务器编程 学习笔记 第二章 IP协议详解

    本章从两方面探讨IP协议: 1.IP头部信息。IP头部出现在每个IP数据报中,用于指定IP通信的源端IP地址、目的端IP地址,指导IP分片和重组,指定部分通信行为。 2.IP数据报的路由和转发。IP数据报的路由和转发发生在除目标机器外的所有主机和路由器上,它们决定数据报是否应

    2024年02月09日
    浏览(41)
  • Linux高性能服务器编程 学习笔记 第五章 Linux网络编程基础API

    我们将从以下3方面讨论Linux网络API: 1.socket地址API。socket最开始的含义是一个IP地址和端口对(ip,port),它唯一表示了使用TCP通信的一端,本书称其为socket地址。 2.socket基础API。socket的主要API都定义在sys/socket.h头文件中,包括创建socket、命名socket、监听socket、接受连接、发

    2024年02月07日
    浏览(55)
  • Linux高性能服务器编程 学习笔记 第一章 TCP/IP协议族

    现在Internet使用的主流协议族是TCP/IP协议族,它是一个分层、多协议的通信体系。 TCP/IP协议族包含众多协议,我们只详细讨论IP协议和TCP协议,因为它们对编写网络应用程序有最直接的影响。如果想系统学习网络协议,RFC(Request For Comments,评论请求)是首选资料。 TCP/IP协议

    2024年02月09日
    浏览(64)
  • 【linux高性能服务器编程】项目实战——仿QQ聊天程序源码剖析

    hello !大家好呀! 欢迎大家来到我的Linux高性能服务器编程系列之项目实战——仿QQ聊天程序源码剖析,在这篇文章中, 你将会学习到如何利用Linux网络编程技术来实现一个简单的聊天程序,并且我会给出源码进行剖析,以及手绘UML图来帮助大家来理解,希望能让大家更能了

    2024年04月28日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包