1、网络编程的基础知识总结
网络编程说的是在不同计算机之间进行数据传输和通信。本文主要是一些基础知识的总结:
本文的“计算机”包含电脑、手机、平板、手表、汽车等可以联网的设备。
1.1 网络协议
1.1.1 描述:
网络协议是计算机网络中通信双方共同遵守的规则和约定,就是马路上的红绿灯约定红灯停绿灯行一样,专门用于指导数据的传输和处理。
1.1.2 协议层次:
协议通常有两种说法,分别是OSI七层模型或TCP/IP四层模型,每层协议负责不同的功能。
实际用途比较多的几种协议:
传输层协议:TCP(传输控制协议)和UDP(用户数据报协议)。
网络层协议:IP(互联网协议)、ICMP(互联网控制消息协议)。
应用层协议:HTTP(超文本传输协议)、FTP(文件传输协议)、SMTP(简单邮件传输协议)等。
后面单独摘出来第二节的“2、网络通信协议模型”中详细描述。
1.2 套接字编程-Socket
Socket,直译是插座。它在网络编程中一般称作套接字,用来在不同计算机之间建立连接进行通信。它是基于传输层的TCP和UDP协议封装一种网络通信方式。
套接字类型:
流式套接字(SOCK_STREAM),基于TCP协议,面向连接的可靠的通信方式。
数据报套接字(SOCK_DGRAM),基于UDP协议,是一种无连接的通信,因此可靠性较差。
一般把发起请求的一方称作是客户端,而服务器是提供服务的一方。
通信过程:
客户端是创建套接字,连接服务器,发送请求,接收响应,关闭连接;服务器创建套接字,绑定地址,监听连接,接受客户端连接,处理请求,发送响应,关闭连接。
a、socket()方法创建套接字实例。
b、调用用bind()方法给套接字实例绑定对端的IP地址和端口。
c、服务器端监听连接:使用listen()函数进行监听,等待客户端连接。
d、 服务器端接受客户端发起的连接请求:使用accept()方法接收客户端的连接请求。
e、发送和接收数据:使用send()方法发送数据包,recv()方法接收数据包。
f、调用close()方法关闭套接字,释放资源。
1.3 网络地址
IP地址:用于标识网络中的设备,分为IPv4地址和IPv6地址。IPv4地址由32位二进制组成,版本是点分十进制表示。IPv6地址由128位二进制组成,通常以冒号分隔的十六进制表示。
端口号:一般来说每个设备肯定安装了不止一个应用程序,因此避免混乱,就用端口号来区分同一台设备上的不同应用程序。端口号是一个16位的数字,范围从0到65535。0到1023为知名端口,通常用于系统服务。
就好比你网购的收获地址,xx省xx市xx区xx小区就是IP地址而xx号楼xx单元xx房间就是端口号,这个小区里一定还有其他的邻居,每家每户就相当于计算机上安装的一个应用程序。
1.4 多线程和多进程
Android主线程不能做还是耗时操作,而网络请求恰巧是属于好事操作,因此网络请求需要在子线程发起。当然对于服务器端,也可以使用多个线程来同时处理多个客户端的连接请求,每个线程处理一个客户端连接;与多线程类似,同样还有多进程,也可以使用多进程来处理多个客户端连接。
1.5 安全性
加密传输:使用SSL/TLS协议对数据进行加密传输,确保数据的安全性和完整性。
认证和授权:在应用程序层面实现用户认证和授权,确保只有合法用户才能访问服务。
这块放在3小节详细记录HTTP和HTTPS协议。
2、网络通信协议模型
网络通信协议通常按照OSI(Open Systems Interconnection)模型划分为七层,每层负责不同的功能和任务。以下是OSI七层模型的详细介绍:
2.1 物理层
最底层的硬件部分包括网卡、网线,它定义了电气和功能标准,以便在物理媒介上实现数据传输。
2.2 数据链路层
这里指交换机(Switch),在相邻节点之间提供可靠的传输服务。它将从物理层接收的比特流组织成帧,并进行帧同步、差错控制和流量控制。
2.3 网络层
是说路由器,负责将数据包从源节点传输到目的节点。它定义了IP地址,实现数据包的路由选择和转发。
2.4 传输层
鼎鼎大名的TCP和UDP就在这一层,它提供端到端的数据传输服务,确保数据正确、完整地传输到目的地。它定义了端口号,用于区分不同的应用程序。
TCP-传输控制协议:提供可靠的、面向连接的传输服务。
UDP-用户数据报协议:提供不可靠的、无连接的传输服务。
2.5 会话层
负责建立、管理和终止应用程序之间的会话。它允许不同设备上的应用程序建立连接,进行数据交换。此处包含的协议有网络基本输入输出系统(NetBIOS)、远程过程调用(RPC)等。
2.6 表示层
负责数据的表示、安全和压缩。它确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。此处包含的协议有如加密协议(SSL/TLS)、数据压缩协议等。
2.7 应用层
最顶层也就是最接近用户的一层,为应用程序提供网络服务。它定义了应用程序如何使用网络资源,实现用户与网络的交互。此处包含的协议包括有超文本传输协议(HTTP)、文件传输协议(FTP)、简单邮件传输协议(SMTP)、域名系统(DNS)等。
2.8 TCP/IP模型
OSI模型是一个理论上的模型,而TCP/IP模型是实际互联网中经常使用的模型。其实算简化整合了OSI模型后划分为四层:
- 链路层:对应OSI模型的物理层和数据链路层。
- 网络层:对应OSI模型的网络层。
- 传输层:对应OSI模型的传输层。
- 应用层:对应OSI模型的会话层、表示层和应用层。
3、TCP、UDP、HTTP、HTTPS协议
TCP、UDP和HTTP以及HTTPS是网络通信中常用的协议,它们各自有不同的特点和用途。
3.1 TCP(传输控制协议)
TCP是一个面向连接的协议,在数据传输之前,需要建立一个稳定的连接,这个过程称为三次握手。三次握手完成后,数据传输才能开始。
可靠传输:TCP提供可靠的数据传输服务。它通过序列号、确认应答、超时重传等机制,确保数据正确、完整地传输到目的地。如果数据丢失或出错,TCP会自动重传。
流量控制:TCP通过滑动窗口机制实现流量控制,防止发送方发送数据过快,导致接收方来不及处理。
拥塞控制:TCP还具有拥塞控制机制,当网络出现拥塞时,TCP会降低数据发送速率,缓解网络拥塞。
应用场景:TCP适用于对数据可靠性要求较高的场景,如文件传输、电子邮件、网页浏览等。
最大特点一个字:稳。
3.2 UDP(用户数据报协议)
无连接:UDP是一个无连接的协议,数据传输之前不需要建立连接,直接发送数据即可。因此,UDP的开销较小,传输速度快。
不可靠传输:UDP不提供数据可靠性保证。数据在传输过程中可能会丢失、重复或乱序,UDP不会自动重传或纠正错误。
简单高效:UDP协议简单,开销小,适合传输实时性要求高的数据。
应用场景:UDP常用于对实时性要求高、数据丢失可以接受的场景,如流媒体传输、实时通信、语音/视频通信、游戏等。
最大特点一个字:快。
3.3 HTTP(超文本传输协议)
HTTP是应用层协议,基于TCP协议实现。它主要用于客户端(如浏览器)和服务器之间传输超文本数据,如网页内容、图片、视频等。
特点:
明文传输 :HTTP协议传输的数据是未加密的,以明文形式传输。这意味着数据在传输过程中容易被截获和篡改,存在安全隐患。
无状态协议 :HTTP是无状态的,即服务器不会保存客户端的请求状态。每次请求都是独立的,服务器不会根据之前的请求来处理当前请求。
请求-响应模式 :客户端发送HTTP请求到服务器,服务器处理请求后返回HTTP响应给客户端。
组成 :
请求 :包括请求行(方法、请求URI、HTTP版本)、请求头(如Host、User-Agent等)、请求体(可选)。
响应 :包括状态行(HTTP版本、状态码、状态消息)、响应头(如Content-Type、Content-Length等)、响应体(可选)。
应用场景 :适用于对安全性要求不高的场景,如一些简单的网页浏览、信息查询等。
3.4 HTTPS(安全超文本传输协议)
定义 :HTTPS是在HTTP的基础上,通过在HTTP下层使用SSL/TLS协议来实现数据加密传输的协议。
特点 :
加密传输 :HTTPS使用SSL/TLS协议对数据进行加密传输,确保数据在传输过程中不被截获和篡改。只有合法的客户端和服务器才能解密和理解传输的数据。
认证机制 :HTTPS通过数字证书和证书颁发机构(CA)来验证服务器的身份,防止中间人攻击。客户端在建立连接时会验证服务器的证书是否有效。
数据完整性 :SSL/TLS协议还提供了数据完整性保护,确保数据在传输过程中没有被篡改。
组成 :
SSL/TLS握手 :在HTTP请求之前,客户端和服务器首先进行SSL/TLS握手,协商加密算法、生成会话密钥、验证证书等。
HTTP请求和响应 :在SSL/TLS握手成功后,客户端和服务器之间进行加密的HTTP请求和响应。
应用场景 :适用于对安全性要求较高的场景,如网上银行、电子商务、登录认证等。
总结:
安全性 :HTTPS比HTTP更安全,因为它提供了数据加密、身份验证和数据完整性保护。
性能开销 :由于加密和解密操作,HTTPS会带来一定的性能开销,但现代硬件和优化技术已经使得这种开销变得可以接受。
证书管理 :使用HTTPS需要服务器拥有有效的SSL/TLS证书,通常需要从证书颁发机构购买或使用免费的证书服务。
随着网络安全意识的提高,越来越多的网站和应用都采用HTTPS协议来保护用户数据的安全和隐私。
4、IP地址和端口号
在网络编程中,IP地址和端口号是两个核心概念,它们共同用于标识网络上的通信端点,确保数据能够准确地传输到目的地。
4.1 IP地址
定义:IP地址是用于在网络中标识设备的地址。它告诉数据包应该发送到哪个设备。
类型:
IPv4地址 :由32位二进制数构成,通常以点分十进制格式表示(如192.168.1.1)。IPv4地址分为A、B、C、D和E五类,其中A、B、C类用于普通网络通信。
IPv6地址 :由128位二进制数构成,通常以冒号分隔的十六进制格式表示(如2001:0db8:85a3:0000:0000:8a2e:0370:7334)。IPv6提供了更大的地址空间,解决了IPv4地址耗尽的问题。
功能 :
标识设备 :在网络中唯一标识一个设备。
路由选择 :用于路由器在网络中选择数据包的传输路径。
分配 :IP地址可以是静态分配的(手动设置),也可以是动态分配的(通过DHCP服务器自动分配)。
4.2端口号
定义 :端口号是用于标识设备上运行的应用程序或服务的编号。它告诉数据包应该交给设备上的哪个应用程序来处理。
范围 :
知名端口 :0到1023,通常用于系统服务和常用应用程序(如HTTP服务使用端口80)。
注册端口 :1024到49151,用于用户或应用程序。
动态和/或私有端口 :49152到65535,通常由应用程序在运行时动态分配。
功能 :
区分服务 :在同一台设备上,不同的应用程序可以使用不同的端口号来区分彼此。
多任务处理 :允许多个应用程序在同一台设备上同时运行,而不会发生端口冲突。
绑定 :在套接字编程中,服务器端需要将套接字绑定到特定的端口上,以便客户端可以通过该端口连接到服务器。
通过IP地址和端口号的组合,网络编程能够实现不同设备之间的准确通信,确保数据能够正确地传输到目标应用程序。
想想上面举的网购地址的例子,一目了然。
5、三次握手和四次挥手
在TCP(传输控制协议)中,三次握手和四次挥手是建立和终止一个可靠连接的关键步骤。以下是这两个过程的详细描述:
5.1 三次握手(TCP连接建立过程)
三次握手用于在客户端和服务器之间建立一个可靠的TCP连接。以下是其步骤:
1. SYN :
客户端 :客户端发送一个TCP的SYN(同步)标志的数据包给服务器,以发起一个新的连接,并指定客户端的初始序列号(seq=x)。
目的 :通知服务器客户端希望建立连接,并开始同步序列号。
2. SYN-ACK :
服务器 :服务器接收到客户端的SYN请求后,需要确认客户端的SYN(ack=x+1),同时自己也发送一个SYN请求(syn=y),即SYN-ACK包。
目的 :服务器确认收到客户端的连接请求,并同时向客户端发送自己的初始序列号。
3. ACK :
客户端 :客户端收到服务器的SYN-ACK包后,向服务器发送确认包ACK(ack=y+1),此时TCP连接建立完成。
目的 :客户端确认收到服务器的SYN-ACK包,完成连接建立。
举个栗子:彷佛是快递给你打打电话。“小哥说:您好在吗”=SYN、“你回答,我在家”=SYN-ACK、“小哥说:快递放门口了,记得取”=ACK。
5.2 四次挥手(TCP连接终止过程)
四次挥手用于在客户端和服务器之间终止一个TCP连接。以下是其步骤:
1. FIN :
客户端 :客户端发送一个FIN(结束)标志的数据包给服务器,表示客户端已经完成数据发送,希望终止连接。
目的 :通知服务器客户端不再发送数据,请求关闭连接。
2. ACK :
服务器 :服务器接收到客户端的FIN包后,发送一个ACK(确认)标志的数据包给客户端,确认收到FIN包。
目的 :服务器确认客户端的终止请求,但此时服务器可能还有数据未发送完毕。
3. FIN :
服务器 :当服务器也完成数据发送后,会发送一个FIN标志的数据包给客户端,表示服务器也准备关闭连接。
目的 :通知客户端服务器不再发送数据,请求关闭连接。
4. ACK :
客户端 :客户端接收到服务器的FIN包后,发送一个ACK标志的数据包给服务器,确认收到FIN包。
目的 :客户端确认服务器的终止请求,此时TCP连接正式关闭。
三次握手:确保双方的发送和接收能力都是正常的,从而建立一个可靠的连接。
四次挥手:确保双方的数据传输都已完成,避免数据丢失或重复,从而安全地关闭连接。
通过这些步骤,TCP协议能够在不可靠的网络环境中提供可靠的、有序的、不重复的数据传输服务。
5.3 UDP有没有三次握手的过程?
UDP(用户数据报协议)是一种无连接的协议,它没有三次握手的过程,原因在于UDP的设计目标和特性与TCP不同。
UDP被设计为一个简单的、无连接的协议。它不建立持久的连接,而是直接发送数据报文。这意味着在数据传输之前,不需要进行连接的建立和确认过程。
6、 当用户A通过聊天客户端给B发送一条消息
当用户A通过聊天工具给用户B发送一条消息时,这条消息会经过那些网络传输流程。以下是这个过程的详细描述:
1. 应用层处理
消息生成 :用户A在 聊天聊天界面输入消息并点击发送按钮。
应用层封装 : 聊天客户端将用户输入的消息进行封装,添加必要的协议头信息,如消息类型、长度、时间戳等。
加密处理 :为了保护用户隐私和数据安全,消息通常会被加密。 聊天使用SSL/TLS等加密协议对消息进行加密处理,确保只有合法的接收方才能解密和查看消息内容。
2. 传输层处理
TCP连接 : 聊天客户端与 聊天服务器之间通过TCP协议建立一个稳定的连接。这个连接是通过三次握手过程建立的,确保数据能够可靠地传输。
数据封装 :传输层将应用层封装好的数据进一步封装成TCP数据段。TCP数据段包括源端口号、目的端口号、序列号、确认应答等信息,确保数据的可靠传输和顺序性。
发送数据 :TCP协议负责将数据段发送到网络中,并进行流量控制、拥塞控制等操作,以确保数据在网络中的稳定传输。
3. 网络层处理
IP封装 :网络层将TCP数据段进一步封装成IP数据包。IP数据包包括源IP地址、目的IP地址等信息,用于在网络中进行路由选择。
路由选择 :IP数据包在网络中传输时,会经过多个路由器。路由器根据IP地址和路由表信息,选择最佳路径将数据包传输到下一个节点,直至到达服务器。
4. 数据链路层和物理层处理
数据链路层封装 :数据链路层将IP数据包封装成帧,添加帧头和帧尾等信息,用于在物理媒介上进行传输。
物理层传输 :物理层负责在物理媒介(如网线、光纤等)上将数据帧转换为电信号或光信号,并进行传输。
5. 服务器处理
接收数据 : 聊天服务器接收到用户A发送的数据包后,进行解封装,提取出消息内容。
消息存储和转发 :服务器将消息存储在数据库中,并根据用户B的在线状态进行处理:
在线状态 :如果用户B在线,服务器会将消息直接转发给用户B的客户端。
离线状态 :如果用户B离线,服务器会将消息保存在离线消息队列中,等待用户B上线后再进行转发。
6. 用户B接收消息
客户端接收 :用户B的客户端接收到服务器转发的消息后,进行解封装,提取出消息内容。
解密处理 :如果消息被加密,客户端会使用相应的密钥进行解密,还原出原始消息内容。
显示消息 :客户端将解密后的消息显示在聊天界面中,供用户B查看。
总结:整个聊天消息的传输流程涉及多个网络层次的协同工作,从应用层的消息生成和封装,到传输层的TCP连接和数据传输,再到网络层的路由选择,以及最终的服务器处理和客户端接收。这个过程确保了消息能够在复杂的网络环境中可靠、安全地传输到目标用户。