热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

非科班生网络通信必会知识点归纳

一、网络模型网络模型分两种,一种是OSI模型,一种是TCPIP模型,后者应用更加广泛。这里也主要介绍TCPIP模型。(一)TCPIP模型首先分为4层,从上到下依次是应用层、传输层、

(一)TCP/IP模型

首先分为4层,从上到下依次是应用层、传输层、网络层、数据链路层。 OSI模型中将网络分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。 TCP/IP的应用层是OSI模型中应用层、表示层、会话层的集合,而物理层由于不是我们经常考虑的问题,所以TCP/IP模型没有把物理层算上。

1、数据链路层

数据链路层的核心是以太网协议。以太网协议规定一组电信号是一个数据包,叫一个振,每个帧(frame)分为标头(head)和数据(data),标头包含一些说明性东西,比如发送者,接收者,和数据类型之类的。例如一个电脑发个数据包出去,会广播给局域网(子网)内所有电脑设备的网卡,然后每台设备都从数据包获取接收者的mac地址与自己网卡的mac地址比对,如果一样就说明这是发给自己的数据包。

2、网络层

定义了一套IP协议,有IPV4和IPV6,以IPV4为例,由32个二进制数字组成,用4个10进制数字表示。

IP地址分为三类:

  • A类:第一个字节为网络号,后三个字节为主机号。该类IP地址的最前面为“0”,所以地址的网络号取值于1~126之间。一般用于大型网络。
  • B类:前两个字节为网络号,后两个字节为主机号。该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。一般用于中等规模网络。
  • C类:前三个字节为网络号,最后一个字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。一般用于小型网络。

这三类IP地址构成了三级网络,将网络划分为了三层,不同子网通过上层网关进行转发。

ip之间的通信

  • 同一个子网的通信:

ip之间是如何通信的勒,这里有一个子网以及子网掩码的概念。比如192.168.56.1和192.168.56.2判断是否是一个子网,子网掩码是255.255.255.0,子网掩码用来与ip地址进行与运算,得到的一个值是否完全一样来判断是否是属于一个子网。192.168.56.1与255.255.255.0进行位与与192.168.56.2与255.255.255.0进行位与是一样的,都为192.168.56.0,即他们是同一个子网。同一个子网之间的Ip可以直接进行网络通信,因为子网内的所有设备会上传自己的ip地址和mac地址映射,设备会缓存同一子网其他设备的Ip地址以及mac地址映射,当拆开IP协议层数据包时可以迅速以目标IP查询ARP缓存,以这个mac地址构建数据链路层的数据包。

  • 不同子网的通信

那么不同子网又是如何联通的勒?这里就是网关发挥作用的时候了,网关有多张网卡。以自己家里的路由器为例,也是一个网关,路由器有一张网卡与部的网关相连,也有一张网卡与内部设备进行相连。当然路由器与网关相连使用的是一个公网ip,这里有一个NAT转换的概念,路由器上装有NAT软件,可以将私有网络(也就是我们自己家连上这台路由器所有的网络设备)的私有ip转换为同一个公网ip,这样做主要是为了解决ip不足的问题,因为ipv4协议就那么几位,ip肯定是不够的。路由器在内网与公网之间中起着转发者的作用,当然路由器上面也有网关,当我们要访问某个Ip也不在路由器所有网卡位与的子网中时还需要进行多个网关的转发,这种转发路径由路由表决定。路由表的的生成方式可以是动态(协议共享)或者静态(手动配置)的,当匹配路由表都失败时使用缺省路由,路由到相连的其他网关。

3.传输层

传输层的协议有TCP协议或UDP协议,TCP协议是一套基于端口的点对点通信协议,规定包括如何连接,如何发送,读取消息。是有连接的,不允许丢数据。 UDP则不需要建立连接,传完数据也不需要确认,允许丢数据。 针对此层协议的操作,可使用SocketAPI进行编程,其函数create,listen,accept,connect,read和write等等抽象了TCP/IP协议的一些操作。

4.应用层

合并了OSI中的应用层会话层表示层,协议有比如常见的HTTP协议,邮件协议等等,定义的是通过TCP拿到数据之后怎么处理的协议。

二、常见问题

(一)请求网址的整个过程

  • 请求dns服务器,解析得到访问域名的ip
  • 开始打包数据包经过应用层(按HTTP协议封装成HTTP的数据包),传输层(按TCP协议封装数据包-设置端口),网络层(按IP协议封装数据包),数据链路层(按以太网协议封装数据包)将数据包发送给网关。因为在网络层时通过子网掩码判断不在一个子网,所以会直接发送给网关。以太网包是有限制的,上述的数据包可能会被切为多个包。
  • 网关收到数据包后,会进行路由表进行路由
  • 经过多次路由后到达了目标IP所对应的服务器
  • 对应的服务器依次层层解包,获取http请求报文,处理请求然后又层层封包返回响应

(二)TCP协议的三次握手、四次挥手

首先解释下涉及到的TCP数据包关键头信息。

标志位含义

  • SYN:同步,1和0表示是否是建立联机的数据包
  • ACK:确认,1和0表示确认号是否有效
  • FIN:终止,1和0表示是否要求释放资源,复位连接,即释放运输连接

序号含义

  • seq 序号。TCP将一次连接中所有发送的字节都编上序号,seq表示本报文段的序号。
  • ack 确认号,期待收到对方下一个报文段的序号。

注:通常情况下数据传输阶段返回的ack为上一个接收包的seq+len,但三次握手阶段和四次挥手则直接为seq+1。即三次握手四次挥手的序号计算方式忽略了报文长度。

注意:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

1、三次握手、

  • 第一次握手 客户端发SYN,具体是SYN=1,seq = x(随机值),然后客户端处于SYN_SENT状态(同步已发送)
  • 第二次握手 服务器返回SYN+ACK,具体是SYN=1,ACK=1,seq=y(随机值),ack=x+1,然后服务端状态处于SYN_RECV状态(同步已收到)
  • 第三次握手 客户端发送ACK。具体是ACK=1,seq=x+1,ack=y+1,当包发送完毕后,客户端和服务器进入ESTABLISHED(TCP连接成功)状态

为什么是三次?为了让双方都知道彼此已准备好。设想一个场景,客户端很久之前的第一次握手到达服务器了,但是在这之前,后面重试的握手请求已经建立了连接发送了数据,那么在这个时候客户端是不认识服务器的响应的,所以当服务器返回响应的时候,客户端不会认识这个响应,无法建立连接。

2、四次挥手

  • 第一次挥手 客户端发FIN(FIN=1,seq=u)
  • 第二次挥手 服务器ACK(ACK=1,ack=u+1,seq=v)
  • 第三次挥手 服务器FIN(FIN=1,ack=u+1,seq=w)
  • 第四次挥手 客户端ACK(ACK=1,seq=u+1,ack=w+1)

为什么连接的时候是三次握手,关闭的时候却是四次握手?因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。另外,第四次挥手后,客户端会等待一段时间在释放连接,确保不会再次收到服务器的第三次挥手(服务器如果没收到客户端的第四次挥手则会尝试重发第三次挥手)。

(三)HTTP协议

1、1.0,1.1,2.0的区别

  • 1.0 一个请求建立关闭一次TCP连接,大量时间资源耗费在建立连接和关闭连接中
  • 1.1 建立一次TCP连接之后不会马上关闭,过一段时间再关闭
  • 2.0 多路复用,并行发送请求,而1.1是串行发送请求

2、HTTPS原理

也就是HTTP+SSL协议,具体流程如图:

问题:

  • 客户端如何验证网站返回的证书?

通过本地权威证书的公钥解开发过来的证书,得到证书的信息摘要,对比证书内容。

  • 为什么中间用了数字信封(即单钥加密消息,公私钥只用于加密单钥)?

因为单钥加解密比非对称加密效率高。非对称加密的核心效果只是用作签名(保证接收者接收的信息来自受信任的私钥密码拥有者或发送的消息只能被拥有私钥方解开)。


推荐阅读
  • 如何在PHP中准确获取服务器IP地址?
    如何在PHP中准确获取服务器IP地址? ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 在配置Nginx的SSL证书后,虽然HTTPS访问能够正常工作,但HTTP请求却会遇到400错误。本文详细解析了这一问题,并提供了Nginx配置的具体示例。此外,还深入探讨了DNS服务器证书、SSL证书的申请与安装流程,以及域名注册、查询方法和CDN加速技术的应用,帮助读者全面了解相关技术细节。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • TCP三次握手过程详解与图示解析
    本文详细解析了TCP三次握手的过程,并通过图示清晰展示了各个状态的变化。同时,文章还介绍了四次挥手的图解,解释了在TIME_WAIT状态中,客户端最后一次发送的ACK包的作用和重要性。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • CSS3 @font-face 字体应用技术解析与实践
    在Web前端开发中,HTML教程和CSS3的结合使得网页设计更加多样化。长期以来,Web设计师受限于“web-safe”字体的选择。然而,CSS3中的`@font-face`规则允许从服务器端加载自定义字体,极大地丰富了网页的视觉效果。通过这一技术,设计师可以自由选择和使用各种字体,提升用户体验和页面美观度。本文将深入解析`@font-face`的实现原理,并提供实际应用案例,帮助开发者更好地掌握这一强大工具。 ... [详细]
  • 微信小程序实现类似微博的无限回复功能,内置云开发数据库支持
    本文详细介绍了如何利用微信小程序实现类似于微博的无限回复功能,并充分利用了微信云开发的数据库支持。文中不仅提供了关键代码片段,还包含了完整的页面代码,方便开发者按需使用。此外,HTML页面中包含了一些示例图片,开发者可以根据个人喜好进行替换。文章还将展示详细的数据库结构设计,帮助读者更好地理解和实现这一功能。 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • 深入解析HTTP网络请求API:从基础到进阶的全面指南
    本文全面解析了HTTP网络请求API,从基础到进阶,详细介绍了Android平台上的两种原生API——HttpUrlConnection和HttpClient。这两种API通过对底层Socket的封装,提供了高效、灵活的网络通信功能。文章不仅涵盖了基本的使用方法,还深入探讨了性能优化、错误处理和安全性等方面的高级主题,帮助开发者更好地理解和应用这些工具。 ... [详细]
author-avatar
LeoWang
帅气鄙人的PHP程序员
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有