网络介绍
网络就是一种辅助双方或者多方能够连接在一起的工具, 试想一下,如果没有网络,这个世界将会是什么样子的。
单机游戏
使用网络的目的
网络编程的目的是为了联通多方然后进行通信用的,即把数据从一方传递给另外一方。 之前学习编写的程序都是单机的,即不能和其他电脑上的程序进行通信。 为了让在不同的电脑上运行的软件,之间能够互相传递数据,就需要借助网络的功能。
网络通信过程
如果两台电脑之间通过网线连接是可以直接通信的,但是需要提前设置好 ip 地址, 并且 ip 地址需要控制在同一网段内。
例如一台为 192.168.1.1
另一台为 192.168.1.2
则可以进行通信。
实际上,我们在访问互联网是,也是同样的原理,因为整个世界都处于同一个大的互联网之中。
- 在浏览器中输入一个网址时,需要将它先解析出 ip 地址来
- 当得到 ip 地址之后,浏览器以 tcp 的方式 3 次握手链接服务器
- 以 tcp 的方式发送 http 协议的请求数据给服务器
- 服务器 tcp 的方式回应 http 协议的应答数据给浏览器
- 浏览器再将得到的内容展示出来
注意
底层细节(了解)
- MAC地址:在设备与设备之间数据通信时用来标记收发双方(网卡的序列号)
- IP地址:在逻辑上标记一台电脑,用来指引数据包的收发方向(相当于电脑的序列号)
- 网络掩码:用来区分ip地址的网络号和主机号
- 默认网关:当需要发送的数据包的目的ip不在本网段内时,就会发送给默认的一台电脑,成为网关
- 集线器:已过时,用来连接多态电脑,缺点:每次收发数据都进行广播,网络会变的拥堵
- 交换机:集线器的升级版,有学习功能知道需要发送给哪台设备,根据需要进行单播、广播
- 路由器:连接多个不同的网段,让他们之间可以进行收发数据,每次收到数据后,ip不变,但是MAC地址会变化
- DNS:用来解析出IP(类似电话簿)
- http 服务器:提供浏览器能够访问到的数据
TCP/IP
网络通信是借助于 TCP/IP
协议族,TCP/IP
(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再它们之间传输的标准,
从字面意思来看 TCP/IP 是 TCP 和 IP 协议的合称,但实际上 TCP/IP 协议是指因特网整个 TCP/IP 协议族。不同于 ISO 模型的七个分层,TCP/IP 协议参考模型把所有的 TCP/IP 系列协议归类到四个抽象层中
应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
传输层:TCP,UDP
网络层:IP,ICMP,OSPF,EIGRP,IGMP
数据链路层:SLIP,CSLIP,PPP,MTU
每一抽象层建立在低一层提供的服务上,并且为高一层提供服务,看起来大概是这样子的
TCP/IP 介绍
上世纪 70 年代,随着计算机技术的发展,计算机使用者意识到:要想发挥计算机更大的作用,就要将世界各地的计算机连接起来。但是简单的连接是远远不够的,因为计算机之间无法沟通。因此设计一种通用的“语言”来交流是必不可少的,这时 TCP/IP 协议就应运而生了。
TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议和网络协议的简称,它定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。
TCP/IP 不是一个协议,而是一个协议族的统称,里面包括了 IP
协议、ICMP
协议、TCP
协议、以及 http
、ftp
、pop3
协议等。网络中的计算机都采用这套协议族进行互联。
1. ip 地址
网络上每一个节点都必须有一个独立的 IP 地址,通常使用的 IP 地址是一个 32bit 的数字,被 .
分成 4 组,例如,255.255.255.255
就是一个 IP 地址。有了 IP 地址,用户的计算机就可以发现并连接互联网中的另外一台计算机。
在 Linux 系统中,可以用 ifconfig -a
(wimdows
为 ipconfig
)命令查看自己的 IP 地址:
什么是地址
地址就是用来标记地点的
互联网的服务:ip + port 去进行访问的
2. 端口号
IP 地址是用来发现和查找网络中的地址,但是不同程序如何互相通信呢?这就需要端口号来识别了。如果把 IP 地址比作银行 ,端口就是出入这间房子的服务窗口。真正的银行只有几个服务窗口,但是端口采用 16 比特的端口号标识,一个 IP 地址的端口可以有 65536(即:2^16)个之多!
服务器的默认程序一般都是通过人们所熟知的端口号来识别的。
例如,对于每个 TCP/IP 实现来说,
- SMTP(简单邮件传输协议)服务器的 TCP 端口号都是
25
, - FTP(文件传输协议)服务器的 TCP 端口号都是
21
, - TFTP(简单文件传输协议)服务器的 UDP 端口号都是
69
。 - MySQL(mysql数据库)服务器的TCP端口默认为 3306
- Redis(redis数据库)服务器默认TCP端口为 6379
任何 TCP/IP
实现所提供的服务都用众所周知的 1-1023
之间的端口号。这些人们所熟知的端口号由 Internet 端口号分配机构(Internet Assigned Numbers Authority, IANA
)来管理。
3. 域名
用 12 位数字组成的 IP 地址很难记忆,在实际应用时,用户一般不需要记住 IP 地址,互联网给每个 IP 地址起了一个别名,习惯上称作域名。
域名与计算机的 IP 地址相对应,并把这种对应关系存储在域名服务系统 DNS(Domain Name System) 中,这样用户只需记住域名就可以与指定的计算机进行通信了。
常见的域名包括 com、net 和 org 三种顶级域名后缀,除此之外每个国家还有自己国家专属的域名后缀(比如我国的域名后缀为 cn)。目前经常使用的域名诸如百度(www.baidu.com)、Linux 组织(www.lwn.net)等等。
我们可以使用命令 nslookup
或者 ping
来查看与域名相对应的 IP 地址。
例如:
关于域名与 IP 地址的映射关系,以及 IP 地址的路由和发现机制,暂时不详细介绍。
TCP/IP 协议
我们一直处在网络的世界中,理所当然地认为底层的一切都可以正常工作。现在,我们来真正地深入底层,看看那些维持系统运转的东西到底是什么样。
因特网是基于规则的,这些规则定义了如何创建连接、交换数据、终止连接、处理超时等。这些规则被称为 协议
,它们分布在不同的层中。分层的目的是兼容多种实现方法。你可以在某一层中做任何想做的事,只要遵循上一层和下一层的约定就行。
最底层处理的是电信号,其余层都基于下面的层构建而成。在大约中间的位置是 IP(因特网协议)层,这层规定了网络位置和地址的映射方法以及数据包(块)的传输方式。IP 层的上一层有两个协议描述了如何在两个位置之间移动比特。
TCP(传输控制协议)
这个协议被用来进行长时间的连接。它会发送比特流并确保它们都能按序到达并且不会重复。
UDP(用户数据报协议)
这个协议被用来进行少量数据交换。一个 数据报 是一次发送的很少信息,就像明信片上的一个音符一样。
UDP 信息并不需要确认,因此你永远无法确认它是否到达目的地。
socket 的概念
到目前为止我们学习了 ip 地址和端口号还有 tcp 传输协议,为了保证数据的完整性和可靠性我们使用 tcp 传输协议进行数据的传输,为了能够找到对应设备我们需要使用 ip 地址,为了区别某个端口的应用程序接收数据我们需要使用端口号,那么通信数据是如何完成传输的呢?
使用 socket 来完成
socket (简称 套接字) 是 进程之间通信一个工具,好比现实生活中的 插座,所有的家用电器要想工作都是基于插座进行, 进程之间想要进行网络通信需要基于这个 socket。
插座效果图:
socket 效果图:
负责进程之间的网络数据传输,好比数据的搬运工。
不夸张的说,只要跟 网络相关的应用程序或者软件都使用到了 socket 。
进程之间网络数据的传输可以通过 socket 来完成, socket 就是进程间网络数据通信的工具。