【牛客网C++服务器项目学习】-Day09-网络模型个人总结

项目学习地址:【牛客网C++服务器项目学习】

day09

项目学习进入了第四章——网络编程。这一章的学习,前半段是对计算机网络体系进行一个大致的讲解。我自己在今年4月份系统性的看了《计算机网络自顶向下》以及中科大郑诠老师的视频。可是,碍于计网的学习主要以知识概念为主,很多知识学过一遍后就忘记了,在脑子中根本就记不住。现在项目既然复习到了这,我觉得有必要自己在文档中,用自己的语言,有条理的归纳一些计网的知识概念。这样做的好处有两个,一是可以帮助自己梳理知识、二是可以加深对某些知识的记忆。

知识点的总结按照老师上课讲得顺序,涉及到某些比较重要的我会进行拓展补充。

参考资料:

1.《计算机网络自顶向下》第七版

2.《图解网络V3.0》——小林Coding

1.网络模型

谈到网络模型,大家脑子里先要对计算机网络体系有一个大致的认识:网络的存在是为了满足计算机之间远距离通信的需求,而为了保证通信能够高效、有序、正确的进行下去,诞生了一系列的协议。至今已经诞生了太多了的协议,为了更好的管理和组织各种类型的协议,提出了网络模型的概念。

在网络模型中,对协议进行了分层,按照每一种协议所实现的功能、所依赖的服务进行分层。目前我们熟知的OSI 7层协议、TCP/IP 4层协议以及5层的因特网协议。

img

引用一句郑诠老师常说的话:下一层是向上一层提供服务,同一层之间通过协议保证能够高效、有序、正确的完成通信,以便于更好的向更上层提供服务。

网络模型将众多纷繁复杂的网络协议有序的管理了起来,就好比一家庞大的公司,势必要是设置不同等级的职位,有层次的、有组织的才能管理好。

下面依次介绍各层协议的作用:

  • 应用层:

    • 应用层是我们平时就能直接接触到的一层协议。

    • 常见的应用层协议有HTTP协议、FTP、SMTP、DNS等。

    • 应用层的功能:应用层只需要专注于为用户提供应用功能,拿HTTP协议来说,该协议专注于计算机网络中两点之间传输超文本数据的规范

    • 应用层的信息分组称为报文

  • 传输层:

    • 传输层提供端到端传输数据的基本功能,这里的端指的是主机进程的端口号(Port)

      • 端口:可以认为是计算机同外界通信的一个窗口。一个计算机内部的通信可以通过进程ID、线程ID来区分通信双方的身份。但是进程ID、线程ID是内部信息、且一个程序,每次启动后系统分配的进程(线程)ID都是随机的,两个主机之间的通信不能够采用进程ID进行身份识别,这便有了端口的由来
      • 端口总数2^32 = 65535个,0-1023是公共端口,例如80端口是WWW、21 端口分配给 FTP 服务,22端口给了SSH服务、23 端口分配给 Telnet服务等等。剩下的才是用户设计程序时可以自由分配的。
    • 传输层为运行在不同主机上的进程提供了逻辑通信,实现的是应用-应用之间的通信;

    • 传输层有两个很重要的协议:TCP和UDP

      • TCP协议是面向连接提供可靠数据传输的协议。

        • TCP协议为了保证其可靠性,相较于UDP增加了很多特性:超时重传(rdt1.0, rdt2.0, rdt2.1, rdt3.0)、拥塞控制、流量控制等
      • UDP协议是面向无连接提供不可靠数据传输的协议。

        • UDP协议虽然不能保证传输数据的可靠性,但是UDP协议传输效率高、速度快,对于那些不重视数据可靠性传输,对传输的时效性有很高要求的应用场合:例如直播,此外还有应用层的DNS协议,还是很适用的

          • DNS协议为什么采用UDP协议进行数据传输?

            • 因为UDP快啊!UDP的DNS协议只要一个请求、一个应答就好了。 而使用基于TCP的DNS协议要三次握手、发送数据以及应答、四次挥手,但是UDP协议传输内容不能超过512字节。 不过客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。
    • 传输层的信息分组称为段。

  • 网络层:

    • 网络层是为处于计算机网络中的俩主机之间提供点对点的逻辑通信服务

      • 在网络层中,其协议发挥的作用主要分为两点:路由 和 转发

        • 路由:使用路由算法来决定数据分组从发送主句到目标接收主机的路径。这里会涉及很多涉及路径规划的算法(图的算法),目前主流的路由算法有OSBF和BGP算法。
        • 转发:转发指的是网络层中路由器的功能,转发的意思是数据报到达路由器的接收端后能够正确的从输出端输出(路由器一般具有多个输入和输出端口)
    • 工作在网络层的有大名鼎鼎的IP协议,除此之外,还有ICMP协议(互联网控制报文协议)

      • IP协议涉及到的知识点:

        • IPv4的地址分类

          • ABC类地址分类法、CIDR地址分类法
          • 子网掩码
        • DNS域名解析协议

          • 该协议能够通过域名得到域名对应的IP地址。DNS域名解析协议在内部也是分层的,总共分了三层,其目的也是为了高效、正确的查找到域名对应的IP地址
        • ARP协议

          • 由MAC地址查询对应的IP地址
        • NAT网络地址转换

          • 为了解决IPv4网络地址不够用的情况,在同一组网络环境下(家庭、学校、公司)的主机向外接收和发送数据时,把私有的IP地址转换为统一的公有IP地址进行通信
    • 网络层的信息分组称为包。

  • 数据链路层:

    • 数据链路层协议是规定网络中,节点与节点之间进行数据传输的协议

    • 数据链路层的常见协议(应用)有以太网(局域网的一种协议),WIFI,电话接入网络等。

    • 数据链路层的信息分组成为帧。

  • 物理层

    • 物理层是为数据链路层提供二进制比特流传输服务的一层协议。

2.键入URL网址到浏览器显示页面的过程阐述

上面我理了一下网络模型各层次的含义以及作用,并分别介绍了各层次常见的一些协议。我觉得学计网应该从全局出发,用真实例子串起来各个分散的知识,一个比较全面和唾手可得的例子就是:在浏览器中输入网址,到浏览器显示对应的画面,计算机背后都做了哪些事情?

应用层:

在应用层会涉及到两个协议:HTTP和DNS协议。

  • HTTP协议规定计算机网络中两点之间进行报文交换的规范。我们通过网站域名去访问网页,其网页上显示的文字、图片、音视频都是通过http协议进行传输的。浏览器是客户端,客户端发出请求,向服务器请求资源,这是网络设计模式中的C/S模式。

使用http协议,能够将我们客户端的主机名称、请求资源的时间、请求资源等信息封装到http的报文中,http的报文是该协议的标准规范内容之一,内容太长,这里就不具体阐述了。你只需要记住,向服务器发出的请求和服务器返还的资源都是通过http报文传输的

  • DNS协议是用于获取域名所对应的IP地址的协议。由于IP地址是32位数字,又长又难记,所有衍生出了域名这一概念。像我们平时使用的www.baidu.com就是百度公司的域名。一个域名下可以有多个IP地址。查询域名的过程也是向服务器请求资源的过程,查询的过程一般是:

    • 访问本地DNS服务器。DNS协议虽然只把域名分为3个层次:根域名、顶级域名、权威域名。但是我们身边的网络一般会配有一个本地的DNS服务器,保存我们经常查询的域名信息,加快我们查询的速度。所以,如果本地DNS服务器中保存有我们需要的域名信息,服务器会返回我们域名对应的IP地址;如果没有,那么进入第二步;

    • 访问根DNS服务器。根DNS服务器接收到请求后,会根据后置属于哪个顶级域,告诉我们访问哪一个顶级域DNS服务器;

    • 访问顶级域DNS服务器:本地主机继续向顶级域DNS服务器请求网址,顶级域DNS服务器会告知需要访问的权威DNS服务器。

    • 访问权威DNS服务器:权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。。

img

至此,在应用层的任务便告一段落。通过http协议我们生成了一个请求资源的报文,报文作为我们应用层承载信息的载体,在后面的旅程(网络层次的逐层递减过程中)会发生一些改变。更具体地讲,就是下一层的协议获取到上一层传递下来的数据报后,会进行一个封装的操作,封装会在原有的数据报的头部或者尾部加上本层的信息。

传输层:

从传输层开始,后面的几层都是在系统的内核区完成的,应用层是在操作系统的用户区完成的。

  • 在传输层,我们接收到了来自应用层的报文后,会在报文的头部,添加上TCP/UDP头部信息。

img

  • 首先,端口号必不可少。传输层提供的是不同主机进程上的逻辑通信,没有端口号怎么能正确识别通信的双方。

  • 序号是保证数据传输的有序;

  • 确认号是确认发出去的信息是否被收到,也就是TCP可靠传输中的ACK num;

  • 接下状态位。例如SYN是发起一个连接,ACK是回复,RST是重新连接,FIN是结束连接

  • 还有一个重要的就是窗口大小。TCP 要做流量控制,通信双方各声明一个窗口(缓存大小),标识自己当前能够的处理能力,别发送的太快,撑死我,也别发的太慢,饿死我等。

  • 在传输层,如果报文的长度超过了MSS的大小,我们还需要对报文进行分割。因为在数据链路层的以太网,规定了每次数据传输的最大长度为1500字节(局域网除了占据市场最大的以太网,还有ATM、FDDI等其他局域网,他们对单次数据传输的大小的限制又不相同了)

  • 除了对报文作上述的封装,“TCP协议是面向连接提供可靠数据传输的协议。”这句话中,面向连接指的就是要在通信的双方之间建立安全可靠的连接。这也就引出了TCP的三次握手和四次挥手的内容:

    • 面试官问1:TCP建立连接为什么一定要使用3次握手?2次行不行?4次行不行?
    • 面试官问2:TCP结束连接为什么一定要使用4次挥手?3次行不行?2次行不行?

网络层:

网络层接收到了来自传输层的段之后,会加上网络层的头部信息,形成在网络层传输的包

img

  • 在 IP 协议里面需要有源地址 IP 和 目标地址 IP:

    • 源地址IP,即是客户端输出的 IP 地址;
    • 目标地址,即通过 DNS 域名解析得到的 Web 服务器 IP。
  • 因为 HTTP 是经过 TCP 传输的,所以在 IP 包头的协议号,要填写为 06 (十六进制),表示协议为 TCP。

网络层的路由器通过路由算法在内部维护了一张路由表(有静态的、动态变化的)。从源IP开始,通过路由表,数据包能够被正确的转发到下一个路由器,经过多次转发,最后转发到目的IP所在的路由器那里去。

在 Linux 操作系统,我们可以使用 route -n 命令查看当前系统的路由表。

img

链路层:

链路层提供的是点对点的传输服务。不过,在链路层进行寻址通信采用的地址是MAC地址,这时ARP协议便开始发挥作用。ARP协议能够在一个子网中通过广播问询的方式,得到一个IP地址对应的MAC地址。

img

在 Linux 系统中,我们可以使用 arp -a 命令来查看 ARP 缓存的内容。

img

IP地址10.0.12.1对应的MAC地址为fe:ee:5e:4d:d7:bb

此外,在链路层我们需要对从网络层获取到的包进行本层信息的封装,在包的头部添加MAC头部信息形成

img

至此,我们已经将需要发送的数据打包好,形成了能够发送的帧,接下来就是将数据发送出去

传输过程:

第一步:网卡:

网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方。因此,我们需要将数字信息转换为电 信号,才能在网线上传输,也就是说,这才是真正的数据发送过程。 负责执行这一操作的是网卡。

第二步:交换机:

交换机的设计是将网络包原样转发到目的地。交换机工作在 MAC 层,也称 为二层网络设备。 交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口。

第三步:路由器:

网络包经过交换机之后,现在到达了路由器,并在此被转发到下一个路由器或目标设备。 这一步转发的工作原理和交换机类似,也是通过查表判断包转发的目标。

不过在具体的操作过程上,路由器和交换机是有区别的。

  • 因为路由器是基于 IP 设计的,俗称三层网络设备,路由器的各个端口都具有 MAC 地址和 IP 地址;
  • 而交换机是基于以太网设计的,俗称二层网络设备,交换机的端口不具有 MAC 地址。

网络包通过路由器后就正式进入了网络核心中,通过多次的路由和转发,最后顺利抵达服务器所在的位置。

数据到达服务器后,服务器会对数据包进行分用。将沿着协议栈自底向上依次传递。各层协议依次处理帧中本层负责的头部数据,

以获取所需的信息,并最终将处理后的帧交给目标应用程序。这个过程称为分用(demultiplexing)。

img

img

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牛客的课程《Linux高并发服务器开发》中包含了项目笔记,其中涉及到了WebServer的开发。根据引用的信息,这门课程的学习进度可能由于个人原因而拖延了一段时间。在第五章的项目学习中,可能包含了关于多进程服务器开发的学习内容。不过具体的学习笔记可能还没有迁移到pad上,暂时无法获取详细的内容[2]。根据引用,在服务器开发中,使用单Reactor和多线程的方法可以提高效率,并充分利用多核CPU的性能优势。然而,使用多线程开发可能需要在各自的线程上加锁保护临界区数据,相对较为复杂。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [牛客c++web服务器项目学习笔记-第0章 课程介绍](https://blog.csdn.net/weixin_45139984/article/details/132205586)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【牛客C++服务器项目学习】Day12-网络编程的两种事件处理模式](https://blog.csdn.net/qq_42518941/article/details/122283291)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值