计算机网络的背景
背景:早在20世纪50年代初,美国建立的地面防空系统就是将地面的雷达和其他测量控制设备的信息通过通信线路汇集到一台中心计算机进行处理,开创了把计算机技术和通信技术相结合的尝试。20世纪60年代中期开始,出现、发展了若干个计算机互连的系统,开创了“计算机与计算机”通信的时代,并呈现出多处理中心的特点。以ARPA网为代表,标志着我们目前常称的计算机网络的兴起。目前ARPA网仍在继续运行之中,已经扩展到连接数百台计算机,ARPA网是一个成功的系统,它在概念、结构和网络设计方面都为后继的计算机网络打下了基础。
1.1计算机网络的发展历,它的演变可分成三个阶段:
1.以单个计算机为中心的远程联机系统,构成面向终端的计算机网络;
2.多个主计算机通过线路互联的计算机网络;
3.具有统一的网络体系结构、遵循国际标准化协议的计算机网络。
刚开始时每一个计算机都是相互独立的,不协同作用。
但是此时小松完成了A功能,小竹要利用A功能实现B功能,而小梅要在A, B的基础上实现C功能,所以相互独立的电脑就差点意思了。
这时就演变出一种新模式:
局域网的出现:随着网络的普及,现在每家每户基本都有WiFi,自家的电脑可以通过路由器和调制解调器来连接一些网络,而这个部分就可以看做是一个局部网。
然后多个局域网连接就形成了错综复杂的广域网。
1.2认识协议
网络协议:网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
1.21协议的由来
计算机厂商很多
计算机操作系统很多
计算机硬件设备系统很多
如何让这些不同的事情来能使计算机流畅的交流,就需要有人站出来,达成一个标准--- 网络协议
两台计算机由网络来进行连接,并且计算机的距离也很远,由一个给另一台传送数据。但是数据也是有类别的,有姓名,年龄这样的数据,还有让目标主机帮我把信息删除,还有的是让信息重传等等。因为类别的不同,所以处理方式也应该不同,这个是第一个共识。
第二个共识就是让两个相隔千里之外的电脑可以更快速,准确的识别其他主机传来的信息,就必须对一些信息达成共识。
就比如当你给家里,打电话,但是电话费特别贵,所以你就和家里约定,如果打的电话滴滴响两声,就代表你平安无事,响三声就代表没钱了。这就是协议,但是如果不是先约定好你知道是啥意思吗?
1.22协议分层
计算机之间的传输媒介是光信号和电信号,通过“频率”和“强弱”来表示0, 1这样的信号,多个01信号进行组合形成一条条交流信息。
但是有的硬件厂商 用频率的疏密表示0,1信号,也有的 用波的强弱表示0,1信号,如果这些硬件厂商的二进制表示方法不一样,那还是达成不了共识,所以这些计算机硬件厂商也必须遵守这样的协议。
所以必须既要有软件协议又要有硬件标准,二者缺一不可
1.3网络分层
协议的本质是软件,而软件是可以分层的。
协议在设计的时候就是被层状划分的。
其实在生活中,打电话就是分层的,你给另一个人说话,但是是通过你的手机根据一些底层实现把你说的话变成一些信息传给另一台手机,然后那部手机在通过信息处理后将你说的话传递给别人,这不就是分层的吗。
1.31为何要进行层状划分呢?
a.场景复杂
b.功能解耦,便于人们进行维护。
就比如你的公司和其他公司进行义务办理,但是你又不便说一些话,所以就可以让你的秘书给你传话给对方等。
功能解耦是让本层去干本层的事情,就比如手机就专门进行传话的功能。如果其中的一个环节出现错误,我们直接就可以定位到出错的地方。
1.32通信的复杂性
当你和朋友距离5米交流时没问题,但是相隔五百米进行交流是不是就有点吃力了,其中还会遇到回音啥的问题,但是如果你俩相隔5000米的话,是不是就变得非常困难了。
同理:通信的复杂本质是和距离成正相关的。
设置网络协议不就是让通信更便捷吗,换个角度想,如果知道复杂性体现在那些方面,那这些方面就是协议必须要处理的问题。
通信范畴的复杂性
丢包【传输层】------- 一台主机连接另一台主机,但是那台没收到信号
定位问题【网络层】 ----- 另一台主机和你相差千里,但是相差千里的不止一台,咋样才能找到那一台主机
解决下一跳问题【数据连接层+物理层】----如果两台机子相邻太远,就要找中间商,但是你在交付中间设备是如何保证能正确找到需要的那台主句。
如何处理数据----应用层
1.4TCP/IP协议的分层
TCP/IP 协议族按照层次 由上到下 分成 4 层,分别是 应用层 (Application Layer)、 传输层 (Transport Layer)、 网络层 ( Internet Layer,或称网际层)和网络接口层(Network Interface Layer,或称 数据链路层 )。
应用层包含所有的高层协议,比如 Telnet(Telecommunications Network,远程登录协议)、FTP、SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)、DNS(Domain Name Service,域名服务)、NNTP(Net News Transfer Protocol,网络新闻传输协议)和 HTTP 等。Telnet 允许一台机器上的用户登录远程机器进行工作,FTP 提供将文件从一台机器上移到另一台机器上的有效方法,SMTP用于电子邮件的收发,DNS 用于把主机名映射到网络地址,NNTP 用于新闻的发布、检索和获取,HTTP 用于在 WWW 上获取主页。
应用层的下面一层是传输层,著名的 TCP 和 UDP(User Datagram Protocol,用户数据报协议)就在这一层。TCP 是面向连接的协议,它提供可靠的报文传输和对上层应用的连接服务。为此,除了基本的数据传输外,它还有可靠性保证、流量控制、多路复用、优先权和安全性控制等功能。UDP 是面向无连接的不可靠传输协议,主要用于不需要TCP的排序和流量控制等功能的应用程序。
传输层的下面一层是网络层,该层是整个 TCP/IP 体系结构的关键部分,其功能是使主机可以把数据报(Packet,或称为分组)发往任何网络,并使分组独立地传向目标。这些分组经由不同的网络到达的顺序和发送的顺序可能不同。网络层使用的协议有 IP。
网络层的下面是数据链路层,该层是整个体系结构的基础部分,负责接收 IP 层的 IP 数据报,通过网络向外发送,或接收从网络上来的物理帧,抽出 IP 数据报,向 IP 层发送。该层是主机与网络的实际连接层。
数据链路层下面就是实体线路(比如以太网络、光纤网络等)。数据链路层有以太网、令牌环网等标准,负责网卡设备的驱动、帧同步(就是从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。交换机可以在不同的数据链路层的网络之间(比如十兆以太网和百兆以太网之间、以太网和令牌环网之间)转发数据帧,由于不同数据链路层的帧格式不同,交换机要将进来的数据报拆掉报头重新封装之后再转发。
1.41TCP/IP的通讯过程
局域网中的两台主机是可以直接通讯的。
从逻辑上讲:两台主机的应用层是可以可以直接通信的,但是从物理上讲,不能将数据从应用层直接传到对方主机的应用层。在物理上它是自顶向下将数据交到链路层,在以太网上跑完之后在自底向上跑到对方应用层。
重点:
每层都有自己的协议定制方案
每层协议都有自己的协议定制报头
从上到下交付数据时,要添加报头
报头类似快递上面的快递单,这个快递单上写了这个快递的详细信息。
但是这个快递单是给谁看的?卖家看吗?你看吗?你们爱看不看。其实他是给快递公司看的。
卖家把手机(假如买个手机)给顺丰,但是顺丰为了让快递安全到达你的手中,所以就必须根据快递单来进行配送。但是快递到达你的手中后,你会看快递单吗,看不看都行。
每一层都添加上自己的报头进行识别,到最后其实就变成了最后一个(链路层)在局域网中移动。
自上而下进行封装的过程就是添加报头,报头添加完成后就通过网络进行流通到另一台主机,
封装:添加报头
解包:去掉报头
疑问:
数据链路层能不能把数据直接交付给IP层?
不会,协议层只能同层通信,不能跨层交流。
1.42局域网通信
相信大佬们一定对上课老师提问记忆尤新,其实局域网的通信和这个有很大相似性。
假设A是老师,C是张三,老师让张三起来回答问题,那B, D, E听见了吗?肯定听见了,张三把问题回答了,老师听见了吗?其他人听见了吗?都听见了。这就相当于开麦,你一开麦队友都听见了。但是万一其他人都在说话,那这时是不是就显得非常嘈杂,如果此时老师叫张三还能听得见吗?听得见就非常困难甚至就直接听不见,所以为了解决这个问题,老师就可能让其他人到下课在说话,而在上课时间就一直提问你。
而主机的交流就是向网线里投入光电信号。如果A,C正在进行数据交换,但是D,E也向网线里传送数据,那这些数据就揉在一起了,导致A,C不能正常交流。这种情况就叫做碰撞。
解决碰撞最好的方法就是错开,不在同一时间交流。
MAC地址
局域网中表示主机唯一性:MAC地址
小资料: MAC地址( 英语:Media Access Control Address),直译为 媒体存取控制位址,也称为 局域网地址(LAN Address), MAC位址, 以太网地址(Ethernet Address)或 物理地址(Physical Address),它是一个用来确认网络设备位置的位址。在 OSI模型中,第三层网络层负责 IP地址,第二层数据链路层则负责MAC位址[1] 。MAC地址用于在网络中唯一标示一个 网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址[2] 。
输入命令查看MAC地址:
ifconfig
而ether又有一个翻译叫以太,所以MAC也是以太网。
1.43不在同一局域网间的通信
前面都是在同一局域网间进行通信,那不在同一局域网间进行通信能不能成功?那它是如何实现的?
这个肯定是能成功,他们是依靠路由器来实现的。
A主机能不能直接把信息交给B主机?肯定不能。
一个是通过以太网,一个是通过令牌环网进行交流的,咋可能直接进行信息交流呢?
所以就必须用到路由器,对于主机A,可以通过以太网将信息 传给路由器,而路由器可以通过令牌环网将数据传给另一台主句B从而实现信息从到B的传输。
提到路由器就不得不提到IP地址
1.44IP地址
IP地址的概念在这里我就不在写了,自己去搜吧。
这里我们讲一下IP地址和MAC地址的区别:
假设现在我们刚上高一,我们的高考目标是考上好的大学(高一:源IP, 好大学:目标IP),高一目标是清华大学,到高二了目标变成了武汉大学,(源MAC地址:清华, 目标MAC:武大),到了高三目标又变成了家里蹲大学(源MAC:武大, 目标MAC:家里蹲大学)。
IP地址通常是给我们设置长远的目标,而MAC地址是为了·1解决下一跳问题。
不同局域网的交流过程:
当在以太网中进行数据交流是会添加以太网中特点的报头,然后通过路由器进入另一个局域网时会添加其他局域网内的报头(其实最主要的报头都是在最底层进行添加的,其他层可默认不添加)。但是在不同局域网中他们,同一层的报文一样。就比如IP层的报文和路由器的报文最后到令牌环网中的报文是一样的,差别在于最底层添加的报头不一样。
但是在这个过程中IP地址一直是不变的,而MAC地址是改变的
IP和MAC区别
1、MAC地址的长度为48位(6个字节);而IP地址为32位。
2、MAC地址应用在OSI第二层,即数据链路层;IP地址应用于OSI第三层,即网络层。
3、MAC地址的分配是基于制造商;IP地址的分配是基于网络拓朴。
1.5数据包的封装和应用
1.51封装
不同的协议层对数据包有不同的称谓,在传输层叫做数据段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame).
应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation).
首部信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息.
数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部, 根据首部中的"上层协议字段" 将数据交给对应的上层协议处理。
其实就是添加报头的过程。从上往下是添加报头,从下往上是解包的过程。
其实局域网主机交流时需要考虑两个问题:
报头和有效载荷分离
决定自己的报文向上交给那个协议。(这个由报头决定)
所以每一个协议都要考虑并解决两个问题:
报文是被封装的,如何解包?
决定有效载荷交付给上面的哪一个协议。
其实有的报头中就已经记录了报头和有效载荷的长度,既然能记载有效长度,那就能记载交付那个协议。
1.6协议分层和OSI参考模型
1.61协议的分层
ISO在指定标准的OSI之前,提出了作为通信协议设计指标的OSI参考模型,将协议分为七层,使得原来复杂的网络协议更加简单化
定义:在七层模型中,每个分层都接受由它下一层所提供的特定服务,并且负责为自己的上一层提供特定的服务,上下层之间进行交互所遵循的约定叫做“接口”,同一层之间的交互所遵循的约定叫做“协议”
OSI被分成了七层:
(但是这个模型既复杂又不太实用,所以重点是TCP/IP)
应用层
网络服务与最终用户的一个接口。
协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
表示层
数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
格式有,JPEG、ASCll、EBCDIC、加密格式等[2]
会话层
建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
对应主机进程,指本地主机与远程主机正在进行的会话
传输层
定义传输数据的协议端口号,以及流控和差错校验。
协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层
网络层
进行逻辑地址寻址,实现不同网络之间的路径选择。
协议有:ICMP IGMP IP(IPV4 IPV6)
数据链路层
建立逻辑连接、进行硬件地址寻址、差错校验[3] 等功能。(由底层网络定义协议)
将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
物理层
建立、维护、断开物理连接。(由底层网络定义协议)
TCP/IP 层级模型结构,应用层之间的协议通过逐级调用传输层(Transport layer)、网络层(Network Layer)和物理数据链路层(Physical Data Link)而可以实现应用层的应用程序通信互联。
应用层需要关心应用程序的逻辑细节,而不是数据在网络中的传输活动。应用层其下三层则处理真正的通信细节。在 Internet 整个发展过程中的所有思想和着重点都以一种称为 RFC(Request For Comments)的文档格式存在。针对每一种特定的 TCP/IP 应用,有相应的 RFC[4] 文档。
一些典型的 TCP/IP 应用有 FTP、Telnet、SMTP、SNTP、REXEC、TFTP、LPD、SNMP、NFS、INETD 等。RFC 使一些基本相同的 TCP/IP 应用程序实现了标准化,从而使得不同厂家开发的应用程序可以互相通信。
协议分层的优点:
每个分层可以独立使用,其实系统中某些分层发生变化,也不会影响整个系统,因此可以构造一个扩展性和灵活性都比较强的系统;此外,通过分层可以细分通信功能,更易于单独实现每个分层的协议,界定各个分层的具体责任和义务
协议分层的劣势:
过分模块化,处理变得更加沉重,以及每个模块都不得不事先相似的处理逻辑等
内容有些小多,坚持一下各位。
2.网络编程套接字
2.0预备知识
理解源IP地址和目的IP地址。
假如你正在用QQ聊天,但是光有IP地址是不够的,就比如你有了IP地址就可以把消息发送给对方主机,但是也只能进行到这,电脑上软件这么多,它咋知道解应用给谁。所以还需要一个接口--- 端口 号。
通信的过程:
当你使用百度去搜索一个地址,然后就出现对应的链接。
但是这个过程是两台主机在通信吗?不是的,是主机上面的软件在进行通信。
就比如这个软件客户端,软件服务端。但是更准确的是,程序员编写的客户端,程序端进程运行使得主机能够运行。
将数据在主机间转发仅仅是一种手段,更重要的是交付给主机的哪一个进程!
2.1端口号
所谓的端口,就好像是门牌号一样,客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,每个应用程序对应一个端口号,通过类似门牌号的端口号,客户端才能真正的访问到该服务器。为了对端口进行区分,将每个端口进行了编号,这就是 端口号。
说白了就是为了让主机找到是那个应用程序。
端口号(port)是传输层协议的内容:
端口号是2字节16位的整数
端口号用来标识一个进程,告诉操作系统,当前数据要交付给那个进程。
IP地址+端口号能够表示网络上的某一台主机的某一个进程。
一个端口号只能被一个进程占用。
一个端口号只能和一个进程关联,但是一个进程可以有多个端口号。
(SRC_IP+SRC_PORT)-->套接字-->(DST_IP+DST_PORT)
IP地址加端口号就叫套接字,IP地址表示主机的唯一性,而端口号代表进程的唯一性
2.2TCP协议/UCP协议
2.21两者概念
在TCP/IP网络体系结构中, TCP( 传输控制协议 , UDP( 用户数据报协议 ) 是传输层最重要的两种协议,为上层用户提供级别的通信可靠性。
1. 传输控制协议(TCP): TCP(传输控制协议)定义了两台计算机之间进行可靠的传输而交换的数据和确认信息的格式,以及计算机为了确保数据的正确到达而采取的措施。协议规定了TCP软件怎样识别给定计算机上的多个目的进程如何对分组重复这类差错进行恢复。协议还规定了两台计算机如何初始化一个TCP数据流传输以及如何结束这一传输。TCP最大的特点就是提供的是面向连接、可靠的字节流服务。
2.用户数据报协议 (UDP): UDP(用户数据报协议)是一个简单的面向数据报的传输层协议。提供的是非面向连接的、不可靠的数据流传输。UDP不提供可靠性,也不提供报文到达确认、排序以及流量控制等功能。它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。因此报文可能会丢失、重复以及乱序等。但由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
2.22TCP 和 UDP 有以下区别:
TCP 面向连接(如打电话要先拨号建立连接)提供可靠的服务,UDP 是无连接的,即发送数据之前不需要建立连接,UDP 尽最大努力交付,即不保证可靠交付。
UDP 具有较好的实时性,工作效率比 TCP 高,适用于对高速传输和实时性有较高的通信或广播通信。
每一条 TCP 连接只能是一对一的,UDP 支持一对一,一对多,多对一和多对多的交互通信。
UDP 分组首部开销小,TCP 首部开销 20 字节,UDP 的首部开销小,只有 8 个字节。
TCP 面向字节流,实际上是 TCP 把数据看成一连串无结构的字节流,UDP 是面向报文的一次交付一个完整的报文,报文不可分割,报文是 UDP 数据报处理的最小单位。
UDP 适合一次性传输较小数据的网络应用,如 DNS,SNMP 等。
2.3网络字节序
相信很多人都听过大小端这个概念。数据存在空间中,空间又有对应的地址。但是如何将这个数据在地址中存储是一个很重要的环节,所以就有了大小端。
地址有低地址和高地址之分,数据有低权值位和高权值位的不同。0xaa bb cc dd(左边是高权值)
大端存储---把高权值位存储在低地址处。
小端存储---吧低权值位存储在高地址处。
如果一个大端机个小端机传信息,小端机解释数据时是不是就解释反了。但是这是我们指出了大小端机,一般情况下我们是不知道的。
网络规定所有主机向网络发送数据时必须都是大端存储。
网络为何采用大端不采用小端,这个我确实没搜到,网上的资料太少,各位有兴趣去搜一下吧。
为了是网络具有可移植性使同样的C代码在大端机和小端机上面都能运行,可以调用以下库函数做网络1字节序和主机字节序的转换。
#include<arpa/inet.h>
unit32_t htonl(unit32_t hostlong);
unit32_t htons(unit32_t hostshort);
unit32_t ntohl(unit32_t netlong);
unit32_t ntohl(unit32_t netshort);
h-->host代表本地,to转换,n--->net网络
前面是主机转网络,后两个代表网络转主机。