TCP / IP 四层协议
TCP / IP 是一个四层的体系结构,它从上至下包含应用层、运输层、网际层(强调本层可解决不同网络的互连问题)、网络接口层,在学习时,可结合OSI 和 TCP / IP 的特点,采用一种仅有五层的体系结构。

按照 TCP / IP 四层协议的划分,其中每一层的主要协议如下:

互联网是由大量的 异构 (heterogeneous) 网络通过 路由器 (router) 相互连接起来的,互联网使用的网络层协议是无连接的 网际协议IP (Internet Protocol) 和许多路由选择协议,所以网络层又称 网际 (IP) 层。
网际协议IP 是 TCP/IP 体系中最主要的两个协议之一,也是重要的互联网标准协议之一。
与 IP 协议配套使用的协议:
地址解析协议 ARP (Address Resolution Protocol)
ARP可将IP地址转化为物理地址
网际控制报文协议 ICMP (Internet Control Message Protocol)
传输的数据报可能丢失、重复、延迟、乱序,它定义了 5种差错报文(源抑制、超时、目的不可达、重定向、要求分段)和 4种信息报文(回应请求、回应应答、地址屏蔽码请求、地址屏蔽码应答),它使得IP更加稳固、有效,ping工具利用它进行测试。
网际组管理协议 IGMP (Internet Group Message Protocol)
逆地址解析协议 RARP (Reverse Address Resolution Protocol)
RARP可将物理地址转化为IP地址,原与ARP配合使用,现已不使用

IP协议 经常使用ARP;而 ICMP、IGMP 协议 经常使用IP协议,由此构建 网际层 (internet layer),由于 IP协议 的不可或缺性,又将本层称为 IP层。
域名与IP地址是一一对应的,域名便于记忆,一般使用域名访问网络上的计算机。
IPv4 地址 包含32位,以前,人们将IP地址划分为 A ~ E 类五种类型,现在已广泛使用误分类IP地址进行路由选择,地址区分已经成为历史:

当初,划分 三个级别 的初衷是单位申请到同样网络号的一块地址,其中各台主机号由单位自行分配,IP地址指明了主机、所连接的网络。
对于 主机 / 路由器 来说,地址是32位的。为便于记忆,提出 点分十进制:
10000000 00001011 00000011 00011111 ⇒ 128.11.3.31)不同类IP 对应不同的子网掩码:
| 地址类 | 子网掩码类 | 子网掩码 |
|---|---|---|
| A 类 | 11111111 00000000 00000000 00000000 | 255.0.0.0 |
| B 类 | 11111111 11111111 00000000 00000000 | 255.255.0.0 |
| C 类 | 11111111 11111111 11111111 00000000 | 255.255.255.0 |
可变长子网掩码(VLSM)
为解决小子网对IP地址的浪费,产生了新的划分方案,即 可变长子网掩码 (VLSM),表示方式:IP地址/网络地址数(193.168.125.0/27 :前27为网络地址)
NAT (Network Address Translator) 网络地址翻译 技术,IPv4与IPv6过渡技术中的一种,用于解决IP地址短缺。
动态地址翻译 (Dynamic Address Translation)
重要概念:
存根域(Stub Domain):内部网络的抽象,这样的网络只处理源、目标都在子网内部的通信。存根域包含少量全局IP 地址,有一个边界路由器,处理内外部通信。
假定 m = 需要翻译的内部地址数,n = 可用的全局地址数(NAT地址),当 m : n 满足翻译条件(m ≥ 1 且 m ≥ n)时,可将大的地址空间映射至小的地址空间,所有 NAT 地址 放在一个缓冲区,此时需维护一个 局部 - 全局地址动态映像表。

伪装 (Masquerading)
伪装,也称为 网络地址端口翻译(Network Address Port Translation, NAPT),有些实现中,专门保留了一部分端口号给伪装使用,称为伪装端口号。

IPv6 地址 包含128位,IPv6采用 分级地址模式、高效IP包首部、服务质量、主机地址自动分配、认证、加密等技术。
IPv6数据包格式
IPv6数据包 有一个40字节的基本首部 (base header),其后允许有 0/多个 扩展首部 (Extension Header),再后面是数据。
IPv6 基本首部格式:

IPv6 基本类型:
IPv6 冒号十六进制记法:
每个16位的值用十六进制值表示,各值之间用冒号分隔,例如:
104.230.140.100.255.255.255.255.0.0.17.128.150.10.255.255 ⇒ 68E6:8C64:FFFF:FFFF:0:1180:960A:FFFF
IPv6 零压缩:
一串连续的0可被一对冒号取代,但只能使用一次:
FF05:0:0:0:0:0:0:B3 ⇒ FF05::B3
运输层 为相互通信的应用提供逻辑通信,负责两台主机中进程的通信,提供 通用 的 数据传输服务。
传输控制协议 TCP(Transmission Control Protocol),特点:面向连接,运输实体:TCP报文段,首部大小:20字节,报文段长度决定因素:窗口值、网络拥塞程度。
用户数据报协议 UDP(User Datagram Protocol),特点:无连接,运输实体:UDP用户数据报,首部大小:8字节,报文段长度决定因素:应用进程。
应用层协议定义了应用进程间的通信和交互的规则,应用层交互的数据单元称为 报文(message)。
DNS 服务 (DNS (UDP) : 53)
域名系统工作流程:
远程登录服务 由 远程终端协议 (Telnet 协议) 提供支持,将用户计算机与远程主机连接起来。可在远程运行程序,并在用户端采集输入,又称为 Telnet 远程登录。
远程终端协议 (Telnet 协议(TCP) : 23)
运行 Telnet 客户程序 后,首先与远程主机建立 TCP连接 ,在 23端口 上打开一个套接字,若远程主机上的服务器软件一直侦听此端口的连接请求,便会建立连接可进行联机操作。
邮局协议3(POP3 协议(TCP) : 110)
邮局协议3(Post Office Protocol 3):常用于保管用户未能及时取走的邮件。
简单邮件传输协议 (SMTP 协议(TCP) : 25)
简单邮件传输协议(Simple Mail Transfer Protocol):描述了电子邮件的信息格式及其传递处理方法,保证电子邮件能够正确寻址和可靠的传输。它是面向文本传输的网络协议,不能传输 非 ASCII 码文本、非文字性附件。
多用途 Internet 邮件扩充协议 (MIME 协议)
多用途 Internet 邮件扩充协议(Multipurpose Internet Mail Extensions) :一个互联网标准,最早应用于电子邮件系统,但后来也应用到浏览器。服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME类型。
增强私密邮件保护协议 (PEM 协议)
增强私密邮件保护协议(Privacy Enhanced Mail) :增强保密的邮件,隐私增强邮件(PEM)是使用多种加密方法提供机密性、认证和信息完整性的因特网电子邮件,在因特网中没有被广泛配置。
交互式邮件存取协议 (IMAP 协议 : 143)
交互式邮件存取协议(Internet Mail Access Protocol):主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。
超文本传输协议 (HTTP 协议(TCP) :80)
超文本传输协议(Hyper Text Transfer Protocol):一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。
文件传送协议 (FTP 协议(TCP) : 20 / 21)
文本传送协议(File Transfer protocol) :FTP 提供交互式访问,采用C/S 结构,允许客户指明文件的类型和格式(如是否使用ASCII编码),并允许文件具有存储权限。
简单文件传送协议 (TFTP 协议(UDP) : 69)
简单文本传送协议(Trivial File Transfer protocol):一个简单易于实现的文件传送协议,采用C/S 结构,使用UDP数据报,仅支持传输而不支持交互。
网络文件系统 (NFS 协议(TCP / UDP) )
网络文件系统(Network File System):允许应用进程打开一个远地文件,并在文件的某一特定位置开始读写数据,在网络上仅进行少量的修改数据传输。
动态主机配置协议 DHCP : 67
动态主机配置协议 DHCP (Dynamic Host Configuration Protocol),提供一种新的机制:即插即用连网 (plug-and-play networking)。该机制允许一台计算机加入新的网络和获取IP地址而无需手工添加。
简单网络管理协议 SNMP : 161
简单网络管理协议 SNMP (Simple Network Management Protocol):专门设计用于在 IP 网络管理网络节点(服务器、工作站、路由器、交换机及HUBS等)的一种标准协议,它是一种应用层协议。
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in
给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at
是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案