网络编程三要素:
ip地址、端口、协议
,在网络通信协议下,不同计算机上运行的程序,可以进行数据传输
IP地址:
IP地址是一种在互联网协议中用于识别和定位设备的32位或128位数字地址。它是一个设备在网络上的唯一标识符,用于在互联网上定位和识别设备。
IPv4:
IPv4是目前使用最广泛的IP协议版本,它使用32位地址,可分配约42亿个不同的地址。也就是给每个连接在网络上的主机分配一个32bit地址。按照TCP/IP规定,IP地址用二进制来表示,每个IP地址长32bit,也就是4个字节。本质是很多二进制的数,使用点分十进制转换成了string类型的十进制。
例:一个采用二进制形式的IP地址是11000000 10101000 00000001 01000010
,这么长的地址,处理起来也太费劲了。为了方便使用,IP地址经常被写成十进制的形式,中间使用符号.
分隔不同的字节。于是,上面的IP地址可以表示为“192.168.1.66”。
IPv6:
IPv6是为了解决IPv4地址空间不足问题而产生的新版本,它使用128位地址,可分配的地址空间几乎无限大。IPv6地址通常以冒号分隔的16进制数字表示,IPv6还带来了更好的安全性、移动性、多播和QoS支持等特性,逐渐被广泛采用。
冒分十六进制表示法:
如果计算出的16进制表示形式中间有多个连续的0,可以用两个冒号省略,计算机会识别出并自动补全省略的0
例如:FF01:0:0:0:0:0:0:1101可以压缩为FF01::1101
协议相关DOS命令:
- ipconfig:查看本机IP地址
- ping IP地址:检查网络是否连通
- 127.0.0.1:是回送地址,可以代表本机地址,一般用来测试使用
端口:
网络的通信,本质上是两个应用程序的通信。每台计算机都有很多的应用程序,那么在网络通信时,如何区分这些应用程序呢?如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的应用程序了。也就是应用程序的标识
端口号:
- 用两个字节表示的整数,它的取值范围是0 ~ 65535。其中,0 ~ 1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。
- 一个端口号只能被一个程序使用,如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败
常见协议:
- TCP(传输控制协议):提供可靠的、面向连接的、点对点的数据传输服务,保证数据的完整性、有序性和可靠性,是基于字节流的传输层通信协议。
- UDP(用户数据报协议):提供无连接的、不可靠的、面向事务的数据传输服务,适用于实时性要求高的场景,如视频、音频等数据传输。
- HTTP(超文本传输协议):是互联网上应用最为广泛的一种网络协议,用于在客户端和服务器之间传输超文本。
- HTTPS(安全超文本传输协议):是基于HTTP协议的安全通信协议,通过SSL或TLS加密,保证通信过程的安全性。
- FTP(文件传输协议):用于在网络上进行文件传输,支持文件的上传、下载、删除、重命名等操作。
- IP(互联网协议):是一种网络层协议,提供在不同网络之间传输数据的功能。
- ICMP(Internet控制消息协议):是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。
- IGMP(Internet组管理协议):是因特网协议家族中的一个组播协议。该协议运行在主机和组播路由器之间。
- ARP(正向地址解析协议):通过IP地址寻找对应主机的MAC地址。
- RARP(反向地址解析协议):通过MAC地址确定IP地址。
TCP:
TCP协议是比较安全的通信协议,输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”,断开连接的时候需要四次挥手
特点:
- 需要建立连接
- 不会丢失数据、有序、安全
- 速度慢
- 建立连接后以流的形式传输,没有大小限制
UDP:
UDP是无连接通信协议,在数据传输时,数据的发送端和接收端不建立逻辑连接。
简单来说,当一台 计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。 由于使用UDP协议消耗系统资源小,通信效率高,所以通常都会用于音频、视频、视频会议和普通数据的传输采用UDP协议,即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议
UDP底层不会做校验,数据丢了就丢了,但是可以在应用层做校验,这样就可以弥补安全方面的问题,也就是前期需要把校验的架子做好,后面就会很方便。比如QQ就是用的UDP,不可能说消息丢了就丢了,都是上层做的校验的,但是对于中小型公司来说还不如直接用TCP来的实在,毕竟麻烦,TCP虽然建立连接的时候会慢一点,但是对于很多场景基本上是可以忽略不计的,并且TCP是很规范化的。
特点:
- 不需要建立连接
- 可能会丢失数据、无序、不稳定、安全低
- 速度块
- 每个包最大64kb
UDP与TCP的使用场景:
TCP | UDP |
---|---|
面向连接 | 面向无连接 |
要求系统资源较多 | 要求系统资源较少 |
TCP程序结构较复杂 | UDP程序结构较简单 |
使用流式 | 使用数据包式 |
保证数据准确性 | 不保证数据准确性 |
保证数据顺序 | 不保证数据顺序 |
通讯速度较慢 | 通讯速度较快 |
TCP应用场景:对数据传输安全性要求高,比如文件传输
UDP应用场景:对数据实时传输要求比较高,比如视频、通话、游戏
网络分层架构(分层模型):
为了减少协议设计的复杂性,大多数网络模型均采用分层的方式来组织。每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。每一层利用下一层提供的服务来为上一层提供服务,本层服务的实现细节对上层屏蔽。
业内普遍的分层方式有两种。OSI七层模型 和TCP/IP四层模型。可以通过背诵两个口诀来快速记忆:
OSI七层模型:物、数、网、传、会、表、应
TCP/IP四层模型:链、网、传、应
- **物理层:**主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
- **数据链路层:**定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。如:串口通信中使用到的115200、8、N、1。
链路层可以通过IP获取Mac地址
- **网络层:**在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
网路层可以获取到目标IP
- **传输层:**定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。
主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。 - **会话层:**通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。
获取端口号,标识进程
- **表示层:**可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。
- **应用层:**是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。
对数据进行封装和解封装,没有进行封装(应用层->传输层->网络层->链路层)的数据是无法在网络进行传输的
网络的每一层,都定义了很多协议。这些协议的总称,叫“TCP/IP协议”。TCP/IP协议是一个大家族,不仅仅只有TCP和IP协议,它还包括其它的协议,如下图:
链路层:
以太网规定,连入网络的所有设备,都必须具有“网卡”接口。数据包必须是从一块网卡,传送到另一块网卡。通过网卡能够使不同的计算机之间连接,从而完成数据通信等功能。网卡的地址——MAC 地址,就是数据包的物理发送地址和物理接收地址。
ARP协议:借助Ip地址获取Mac地址
网络层:
- 网络层的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做“网络地址”,这是我们平时所说的IP地址。这个IP地址好比我们的手机号码,通过手机号码可以得到用户所在的归属地。
- 网络地址帮助我们确定计算机所在的子网络,MAC 地址则将数据包送到该子网络中的目标网卡。网络层协议包含的主要信息是源IP和目的IP。
于是,“网络层”出现以后,每台计算机有了两种地址,一种是 MAC 地址,另一种是网络地址。两种地址之间没有任何联系,MAC 地址是绑定在网卡上的,网络地址则是管理员分配的,它们只是随机组合在一起。 - 网络地址帮助我们确定计算机所在的子网络,MAC 地址则将数据包送到该子网络中的目标网卡。因此,从逻辑上可以推断,必定是先处理网络地址,然后再处理 MAC 地址。
传输层:
当我们一边聊QQ,一边聊微信,当一个数据包从互联网上发来的时候,我们怎么知道,它是来自QQ的内容,还是来自微信的内容?
也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做端口 port
,它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。
端口特点:
- 对于同一个端口,在不同系统中对应着不同的进程
- 对于同一个系统,一个端口只能被一个进程拥有
应用层:
应用程序收到“传输层”的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。“应用层”的作用,就是规定应用程序的数据格式。
协议功能:
通信过程:
两台计算机通过TCP/IP协议通讯的过程如下所示:
将Hello发送到一台计算机的执行过程:
封装过程是自上向下的,接收端的解封装是反向执行的
- 应用层:因为数据是在应用程序产生的,所以要先封装数据
- 传输层:在主机上标识一个进程
- 网络层:包含源ip,可以获取目标ip
- 链路层:本身是有源Mac的,可以获取到接收Mac地址,有了Mac地址就知道往哪里发送了
Socket:
- Socket,是插座、插孔的意思,在网络中称为
套接字
,用于描述IP地址和端口,可以实现不同程序间的数据通信。
- Socket起源于Unix,而Unix基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用:Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。因此可以用Socket来描述网络连接的一对一关系。
Socket底层是封装了两个单向的channel,进行网络通信时Socket都是成对出现的。
- 在TCP/IP协议中,
IP地址
+TCP/UDP端口号
唯一标识网络通讯中的一个进程。IP地址+端口号
就对应一个socket。欲建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。因此可以用Socket来描述网络连接的一对一关系。 - 常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。
网络应用程序设计模式C/S和B/S:
C/S模式
传统的网络应用设计模式,客户端(client)/服务器(server)模式
。需要在通讯两端各自部署客户机和服务器来完成数据通信。
B/S模式
浏览器(Browser)/服务器(Server)模式
。只需在一端部署服务器,而另外一端使用每台PC都默认配置的浏览器即可完成数据的传输。
C/S优点:
客户端位于目标主机上可以保证性能,将数据缓存至客户端本地,从而提高数据传输效率。
一般来说客户端和服务器程序由一个开发团队创作,所以他们之间所采用的协议相对灵活。
可以在标准协议的基础上根据需求裁剪及定制。例如,腾讯所采用的通信协议,即为ftp协议的修改剪裁版。因此,传统的网络应用程序及较大型的网络应用程序都首选C/S模式进行开发。如,知名的网络游戏魔兽世界。3D画面,数据量庞大,使用C/S模式可以提前在本地进行大量数据的缓存处理,从而提高观感。
C/S缺点:
由于客户端和服务器都需要有一个开发团队来完成开发。工作量将成倍提升,开发周期较长。
从用户角度出发,需要将客户端安插至用户主机上,对用户主机的安全性构成威胁。
这也是很多用户不愿使用C/S模式应用程序的重要原因。
B/S优点:
由于它没有独立的客户端,使用标准浏览器作为客户端,工作开发量较小。
只需开发服务器端即可。另外由于其采用浏览器显示数据,因此移植性非常好,不受平台限制。
如早期的偷菜游戏,在各个平台上都可以完美运行。
B/S缺点:
由于使用第三方浏览器,因此网络应用支持受限
。另外,没有客户端放到对方主机上,缓存数据不尽如人意,从而传输数据量受到限制。
应用的观感大打折扣。而且必须与浏览器一样,采用标准http协议进行通信,协议选择不灵活。
因此在开发过程中,模式的选择由上述各自的特点决定。根据实际需求选择应用程序设计模式。