一、网络模型
(一)C/S 模型
客户端 / 服务器(Client/Server,C/S)模型是一种常见的网络架构。在这种模型中,客户端是主动的角色,向服务器发起请求;服务器端是被动的角色,等待客户端的请求并提供相应的服务。例如,在文件传输、即时通讯等应用中,通常采用 C/S 模型。
(二)B/S 模型
浏览器 / 服务器(Browser/Server,B/S)模型是随着互联网的发展而兴起的一种网络架构。在这种模型中,用户通过浏览器作为客户端,访问服务器上的资源。服务器端负责处理用户的请求,并将结果返回给浏览器。B/S 模型具有跨平台、易于部署和维护等优点,广泛应用于 Web 应用开发
(三)P2P 模型
点对点(Peer-to-Peer,P2P)模型是一种去中心化的网络架构。在这种模型中,各个节点之间直接进行通信,不需要通过中央服务器。P2P 模型具有高效、灵活、可扩展性强等优点,适用于文件共享、分布式计算等应用。
二、实现编程的方式
(一)UDP
- 特点 :
- 无连接:在数据发送前,不需要建立连接,直接将数据发送到目标地址。
- 不可靠:不保证数据的可靠传输,可能会出现数据丢失、重复、乱序等情况。
- 编程流程(C/S 模型) :
- 客户端:
- 创建 socket:使用
socket
函数创建一个用于 UDP 通信的套接字。 - 发送数据:使用
sendto
函数将数据发送到服务器端。 - 接收数据(可选):使用
recvfrom
函数接收服务器端回发的数据。
- 创建 socket:使用
- 服务器端:
- 创建 socket:使用
socket
函数创建一个用于 UDP 通信的套接字。 - 绑定地址:使用
bind
函数将套接字与特定的 IP 地址和端口号绑定,以便接收客户端的数据。 - 接收数据:使用
recvfrom
函数接收客户端发送的数据。 - 发送数据(可选):使用
sendto
函数将数据回发给客户端。
- 创建 socket:使用
- 客户端:
(二)TCP
- 特点 :
- 面向连接:在数据传输前,需要建立连接,确保数据传输的可靠性。
- 可靠传输:通过确认机制、重传机制等保证数据的准确、完整传输。
- 编程流程(C/S 模型) :
- 客户端:
- 建立连接:
- 创建 socket:使用
socket
函数创建一个用于 TCP 通信的套接字。 - 可选的
bind
操作:如果需要指定本地的 IP 地址和端口号,可以使用bind
函数进行绑定。 - 发起连接请求:使用
connect
函数向服务器端发起连接请求。
- 创建 socket:使用
- 通信过程:
- 使用
read
函数读取服务器端发送的数据。 - 使用
write
函数向服务器端发送数据。
- 使用
- 关闭连接:使用
close
函数关闭套接字,释放资源。
- 建立连接:
- 服务器端:
- 建立连接:
- 创建 socket:使用
socket
函数创建一个用于 TCP 通信的套接字。 - 绑定地址:使用
bind
函数将套接字与特定的 IP 地址和端口号绑定。 - 监听连接请求:使用
listen
函数监听客户端的连接请求。 - 接受连接请求:使用
accept
函数接受客户端的连接请求,建立连接。
- 创建 socket:使用
- 通信过程:
- 使用
read
函数读取客户端发送的数据。 - 使用
write
函数向客户端发送数据。
- 使用
- 关闭连接:使用
close
函数关闭套接字,释放资源。
- 建立连接:
- 客户端:
三、相关函数详解
(一)recvfrom
函数
recvfrom
函数是用于接收数据的函数,在 UDP 和 TCP 编程中都可能用到。
sockfd
:套接字文件描述符。buf
:保存数据的一块空间的地址。len
:这块空间的大小。flags
:接收方式的标志,0 表示默认的阻塞方式。src_addr
:用来保存发送方的地址信息。addrlen
:表示发送方实际的地址信息大小。
返回值:成功返回接收到的字节数,失败返回 -1。
(二)bind
函数
bind
函数用于将套接字与特定的 IP 地址和端口号绑定。
sockfd
:之前通过socket
函数创建的文件描述符,套接字 ID。addr
:物理接口的结构体指针,表示该接口的信息。addrlen
:参数addr
的长度。
(三)connect
函数
connect
函数用于客户端向服务器发起连接请求。
sockfd
:本地socket
创建的套接子 ID。addr
:远程目标主机的地址信息。addrlen
:参数addr
的长度。
返回值:成功返回 0,失败返回 -1。
四、地址
(一)绑定地址
绑定地址是指将服务器程序所在电脑的 IP 地址与套接字进行绑定。在服务器端,绑定地址是为了让客户端能够准确地找到服务器并与之进行通信。在客户端,如果需要指定特定的本地 IP 地址和端口号进行数据发送,也可以使用 bind
函数进行绑定,但通常情况下客户端可以省略 bind
操作,由默认接口发送数据。
(二)查看地址
在 Linux 系统中,可以使用 ifconfig
命令查看网卡相关信息,其中包含 IP 地址。在 Windows 系统下,可以在命令提示符中使用 ipconfig /all
命令查看 IP 地址等网络配置信息。
五、TCP 连接建立与断开
(一)TCP 三次握手建立连接
- 客户端向服务器发送连接请求,表示 "我要和你建立连接"。
- 服务器收到连接请求后,回复 "好的,可以建立连接"。
- 客户端收到服务器的回复后,再次发送确认信息 "好",此时连接建立成功。
(二)TCP 四次挥手断开连接
- 客户端向服务器发送断开连接请求,表示 "我要和你断开连接"。
- 服务器收到断开连接请求后,回复 "好的,可以断开"。
- 服务器向客户端发送自己的断开连接请求,表示 "我也要断开"。
- 客户端收到服务器的断开连接请求后,回复 "好",此时连接断开。