Internet 发展历史
Internet —— “冷战”的产物:
● 1957 年 10 月和 11 月,前苏联先后有两颗“Sputnik”卫星上天;
● 1958 年,美国总统艾森豪威尔向美国国会提出建立 DARPA (Defense Advanced Research Project Agency),即国防部高级研究计划署,简称 ARPA;
● 1968 年 6 月,DARPA提出“资源共享计算机网络” (Resource Sharing Computer Networks),目的在于让 DARPA 的所有电脑互连起来,这个网络就叫做 ARPAnet,即“阿帕网”,是 Internet 的最早雏形;
网络互联促成了 TCP/IP 协议的产生:
● 早期的 ARPAnet 使用网络控制协议(Network Control Protocol,NCP),不同类型的计算机、不同类型的操作系统不能互联,没有纠错功能;
● 1973 年,由 Kahn 和 Vinton Cerf 两人合作,为 ARPAnet 开发了新的互联协议;
● 1974 年 12 月,两人正式发表第一份 TCP 协议详细说明,但此协议在有数据包丢失时不能有效的纠正;
TCP / IP 协议(传输控制协议 / 网间协议)分成了两个不同的协议:
用来检测网络传输中差错的传输控制协议 TCP(Transmission Control Protocol)
专门负责对不同网络进行互联的互联网协议 IP(Internet Protocal)
从此,TCP/IP 协议 诞生。
● 1983 年,ARPAnet 上停止使用NCP,互联网上的主机全部使用 TCP/IP 协议。TCP/IP 协议成为 Internet 中的“世界语”;
● 1969 年,阿帕网(arpanet)诞生;
● 1971 年,电子邮件出现;
● 1973 年,第一个跨大西洋的连接和电子邮件普及;
● 1974 年,TCP/IP 诞生;
● 1977 年,电脑上出现了调制解调器;
● 1979 年,出现了多角色游戏;
● 1983 年,TCP/IP 转正;
● 1984 年,主机数超过了1000台,域名系统出现;
● 1987 年,互联网上主机超过了3万台;
● 1990 年,万维网协议诞生;
● 1991 年,第一个网页诞生;
● 1995 年,互联网商业化;
● 1998 年,google 诞生;
● 2004 年,web2.0 出现;
● 2008 年,移动互联网;
● 2015 年,物联网,虚拟现实;
● 2019 年,5G;
● ……
局域网和广域网
局域网(LAN)
局域网(Local Area Network),本地的网络,只能实现小范围、短距离的网络通信。我们的家庭网络是典型的局域网。电脑、手机、电视、智能音箱、智能插座都连在路由器上,可以互相通信。
同一局域网 : 同一路由器下的同一网段。
广域网(WAN)
广域网(Wide Area Network),是相对局域网来讲的,局域网的传输距离比较近,只能是一个小范围的。如果需要长距离的传输,比如某大型企业,总部在北京,分公司在长沙,局域网是无法架设的,解决办法:第一,通过因特网,只需要办一根宽带,就实现了通信,非常方便,现在的宽带价格也比较便宜。第二,通过广域网专线。然而,为了数据安全,不能连接因特网,需要用一条自己的专用线路来传输数据,这条线路上只有自己人,不会有其他人接入,且距离很远,这个网络就叫 “广域网”。
光猫
光猫类似于数字调制解调器,接入的是光纤专线,是光信号。用于广域网中光电信号的转换和接口协议的转换,接入路由器,是广域网接入。一端连接运营商的入户线缆,一般是光纤;另一端连接我们自己的路由器。是一个运营商到我们自己设备的桥梁。
将光纤插入左侧的灰色口,右侧网口接网线到路由器即可。
交换机与路由器
交换机(二层):用于局域网内网的数据转发
路由器(三层):用于连接局域网和外网
现在的大部分路由器内部都有交换机,所以路由器一般都具有交换机的功能,反之不成立。
路由器需要区分 WAN口 和 LAN口,WAN口 是接外网的(从 Modem 出来的或者从上一级路由器出
来的);LAN口 是接内网的,现在的路由器都带无线功能,本质上无线接入的就是 LAN口。
详细了解交换机和路由器的区别。
(👆 链接至另一博主,放心跳转)
IP 地址
1、IP 地址 是 Internet 中的主机标识,用二进制实现,可以分为 4个八位二进制的数;
2、Internet 中的主机必须具有一个 IP地址 才能跟别的主机通信—— 通过 IP 区分主机;
3、IP地址:IPV4(32位),IPV6(128位);
4、每个数据包都必须携带 目标IP 和 源IP,路由器依靠此信息来为数据包选择路由;
5、IPV4 表示方法: 点分十进制(用 4组 0-255的数字来表示一个 IP地址)。
二级划分
IP = 网络号 + 主机号
网络号:用于区分网段(同一局域网下,网段是一致的)
主机号:在本网段内的 ID,同一局域网下不能重复
A、B、C类地址的子网掩码:
255.0.0.0
255.255.0.0
255.255.255.0
A类:(0.0.0.0-127.255.255.255)(子网掩码:255.0.0.0 或 0xFF000000)
第一个字节为网络号,后三个字节为主机号。该类 IP地址 的最前面为“0”。
用于大型网络,主机号取值:0 ~ 224 ,一般不用,浪费大量的资源。
B类:(128.0.0.0-191.255.255.255)(子网掩码:255.255.0.0或0xFFFF0000)
前两个字节为网络号,后两个字节为主机号。该类 IP地址 的最前面为“10”。
用于中型网络 。
C类:(192.0.0.0-223.255.255.255)(子网掩码:255.255.255.0或 0xFFFFFF00)
前三个字节为网络号,最后一个字节为主机号。该类 IP地址 的最前面为“110”。
一般用于小型网络(比如教室)。
D类:(224.0.0.0- 239.255.255.255)
多播地址,该类IP地址的最前面为“1110”。为多播用户所使用。
E类:(240.0.0.0- 247.255.255.255)
保留地址,该类IP地址的最前面为“1111”,为保密单位所使用。
特殊地址:
0.0.0.0:
在服务器中,0.0.0.0 指的是本机上所有的 IPV4地址(自动匹配本机上的所有 IPV4地址);
127.0.0.1:
回环地址/本机地址,一般用来测试,所有发往该类地址的数据包都应该被原样送回;
网络地址:
每一个网段 主机号全为 0 的地址。
e.g. 192.168.50.0
设计网关:
主机号为 1 的地址。
e.g. 192.168.50.1
广播地址:
主机号最大(全为 1) 的地址为该网段的广播地址。 往广播地址发送内容 , 则该网段所有地址都可以接收到。
e.g. 192.168.50.255
全网广播地址(255.255.255.255)
该地址不能随便使用 , 会影响整个网络。
子网掩码:
作用: 将 某一个IP 划分为网络地址和主机地址;
目的: 合理利用 IP 资源;
特点:
1、与 IP 地址等长,32位/四个字节;
2、网络号全为 1,主机号全为 0。
e.g. 已知子网掩码:255.255.255.0,计算最多能使用多少主机:
主机号(后八位):min = 0000 0000,max = 1111 1111
掐头去尾:去掉广播地址和网络地址,256 - 2 = 254 (台)
Problem:
若有 800 台电脑,根据现有理论,选择哪个网段最好?
B类,但仍然会浪费很多空间(216-800-2 = 64734)。
为了提高资源利用率,采用三级划分:
三级划分
IP = 网络号 + 子网号 + 主机号
重新划分网络号和主机号(在主机号内提取一部分作为网络号),将二级地址转换为三级地址。
Solution:
B类 IP 的子网掩码 255.255.0.0,重新划分网络号和主机号,在主机号内提取一部分作为网络号。
800个主机,需要10个二进制位(29 < 800 < 210),B类 IPv4 的主机号有16位,将其前 6 位置 1,仅保留 后10位 作为主机位,得新划分的子网掩码:
255.255. 1111 1100. 0000 0000 ——> 点分十进制 ——> 255.255.252.0
练习1:
某公司有四个部门:行政、研发1、研发2、营销。每个部门各 30台 计算机接入公司局域网交换机。
如果要在 192.168.1.0 网段为每个部门划分子网(4个部门之间不能通信),子网掩码应该怎么设置,每个子网的地址范围分别是什么?
1)确定网段:C类;
2)需要划分四个子网,占用两位主机位:
192.168.1.00 00 0000
192.168.1.01 00 0000
192.168.1.10 00 0000
192.168.1.11 00 0000;
3)验证剩余主机位(六位)是否满足需求:26 = 64 > 30, 有富余;
4)计算四个子网的地址范围(掐头去尾):
5)设置子网掩码
C类 IPv4 的主机号有8位,将其前 2 位置 1,保留 后6位 作为主机位,得新划分的子网掩码:
255.255. 255. 1100 0000 ——> 点分十进制 ——> 255.255.255.192
思考: 假如问 192.168.1.172 是哪个网段?(网络号是多少?如何判断)
公式
网段 = ip & 子网掩码
主机ID = ip & (~子网掩码)
练习2:
已知一个子网掩码号为255.255.255.192,则最多可以连接多少台主机?
(提示:通过子网掩码内的 0 的个数 来推断容量)
方法一:11 00 0000 ——> 主机号:0 ~ 63 ——> 掐头去尾: 64 - 2 = 62;
方法二:256 - 192 - 2 = 62;
练习3:
有两台电脑主机,在浪费最少 IP地址 的情况下,将172.16.14.4 与 172.16.13.2 划归为同一网段,则子网掩码应该设置为:
1)“172.16”说明“前16位”是相同的;
2) 14 ——> 0000 1110
13 ——> 0000 1101
3)同一网段的子网掩码相同,将 0000 11 改为 1111 11,得子网掩码:255.255.252.0。
网络模型
网络的体系结构
1、网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起。
2、每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层提供的服务。
3、网络体系结构,即指 网络的层次结构 和 每层所使用协议的集合。
4、两类非常重要的体系结构:OSI 与 TCP/IP
分层的好处:
1、各层之间独立,仅仅只需要知道该层通过层间的接口所提供的服务就可以;
2、稳定,其他层发生变化,只要层间接口不变,则本层不受影响;
3、易于维护,出现问题可以根据每一层的功能直接去找指定层。
OSI模型(理想化的模型)
OSI模型 是一个理想化的模型,尚未有完整的实现;
OSI模型 共有七层;
OSI模型 现阶段只用作教学和理论研究。
TCP/IP模型
应用层:应用协议和应用程序的集合
传输层:决定数据交给机器的哪个任务(进程)去处理,通过端口寻址
网络层:提供端对端的传输(可以理解为通过IP寻址机器)
网络接口和物理层:屏蔽硬件差异(驱动),向上层提供统一的操作接口
OSI和TCP/IP模型对应关系图
网络接口和物理层:
网络层:
传输层:
应用层:
UDP协议 和 TCP协议
相同点:
都存在于传输层 ,都是全双工通信。
单工:发送方只能发送数据,接收方只能接收数据。
例如:收音机,对于和电台来说,收音机是接收方,电台是发送方;
对于人来说,收音机是发送方,人是接收方。
半双工: 可以作为发送设备,也可作为接收设备,但同一时刻只能接收或发送。(例如:对讲机)
全双工: 同一时间可发送也可接收。(例如:打电话)
TCP传输控制协议
是一种面向连接的传输层协议,
能提供高可靠性通信(数据无失误、数据无丢失、数据无失序、数据无重复到达)。
适用情况:
1、适合于对传输质量要求较高,以及传输大量数据的通信。
2、在需要可靠数据传输的场合,通常使用 TCP协议。
3、即时通讯软件(如:微信、QQ等)的用户登录,以及文件传输等可靠性场景。
UDP用户数据报协议
UDP(User Datagram Protocol)用户数据报协议,该协议是不可靠的无连接的协议。
UDP在数据发送前,不需要进行连接,就可以高效率数据传输,但是 UDP 不保证传达的完整性。
适用情况:
1、在接收到数据,给出应答较困难的网络中使用UDP。(网好了继续发送)
2、适合于 广播/组播式通信。
3、QQ/微信 视频、语音通话等高效率场景。
4、流媒体、VOD、VoIP、IPTV 等网络服务中采用 UDP方式 进行实时数据传输。
socket 简介 — 新的通信机制
发展
● 1982 - Berkeley Software Distributions 操作系统引入了 socket 作为本地进程之间通信的接口;
(可以理解为 socket 也是进程间的通信,只是把本机的进程间通信,改为了两台不同主机间)
● 1986 - Berkeley 扩展了 socket 接口,使之支持 UNIX 下的 TCP/IP 通信;
● 现在的很多应用(FTP, Telnet, …)都依赖这一接口。
FTP 是一种文件传输协议,用于在网络上传输文件。
Telnet 是一种远程登录协议,允许用户在远程计算机上执行命令。
socket简介:
1、可以认为是一个编程接口;
2、也可以认为是一种特殊的文件描述符(socket 的返回值是一种文件描述符 >> fd);
3、是一种通信机制,并不仅限于 TCP/IP 协议;
4、面向连接(TCP);
5、面向无连接(UDP)。
功能:在内核空间内创建两个缓存区,一个接收缓存区,一个发送缓存区,用户可以接收到两块空间的文件描述符。
面向连接 —— TCP:
socket 套接字的类型
流式套接字(SOCK_STREAM)
对应的匹配协议 >> TCP
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设流量控制(如百度网盘限速),避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。
数据报套接字(SOCK_DGRAM)
对应的匹配协议 >> UDP
提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。
原始套接字(SOCK_RAW)
可以对较低层次协议如 IP、ICMP 直接访问,还有一些 ping命令,都是原始套接字。
socket 的位置
端口号
1、为了区分一台主机接收到的数据包应该给哪个进程来进行处理,使用端口号来区别
(通过 IP地址 找到 哪台主机,通过 port端口号 来找到 本机的哪个进程);
2、TCP端口号 与 UDP端口号 独立不互斥 (UDP port 为8888,TCP port 也可为8888 );
3、端口号一般由 IANA (Internet Assigned Numbers Authority) 管理;
4、端口(sin_port)用2个字节表示(IP地址占4个字节)
被占用的端口
1~1023 (1~255之间通常由 UNIX 系统占用,比如:文件传输端口 TFTP 的端口号为 69)
已登记端口
1024~49151 (---- 可用来建立与其它主机的会话 ----)
动态或私有端口
49152~65535 (-- 固定某些服务使用 --)
字节序
小端序(主机字节序) - 低地址 存放 低字节
大端序(网络字节序) - 低地址 存放 高字节
网络中传输的数据必须用网络字节序,即大端字节序;
终端中显示的数据必须为主机字节序,即小端字节序。
// 如何判断当前主机的字节序?
#include <stdio.h>
union uni{
int a;
short b;
char c;
};
int main(){
int a = 0x12345678;
// 1. 数据类型强转
printf("%#x\n", (short)a);
printf("%#x\n", (char)a);
// 2. 指针强转
char *p = (char *)&a;
printf("%#x %#x %#x %#x\n", *p, *(p+1), *(p+2), *(p+3));
// 3. 利用共用体成员变量
union uni test;
test.a = 0x12345678;
printf("%#x %#x\n", test.b, test.c);
return 0;
}