一. 网络基础知识
今天我们说一下网络开发的基础知识(不是计算机网络专题,所以不会很详细)
网络是什么 多主机连接到一起形成网络
主机是什么 具备网络功能的计算机称为主机
c/s c(客户端)用来与用户交互 单一 s(服务端)提供功能
b/s b(浏览器browser) 繁杂 s(服务端)提供功能
二. 网络分层(七层或五层)
网络分层
五层(五层架构):
1.应用层:
Ftp http https smtp pppoe协议
2.传输层:
Tcp Udp
3.网络层:
IP 往哪里发(IP的去向)
4.数据链路层: 加密 编译 编解码
字节
5.物理层: 硬件(光纤 光缆 双绞线 电信号 光信号)
七层(七层架构):
1.应用层:
表示层
会话层
Ftp http https smtp pppoe协议
2.传输层:
Tcp Udp
3.网络层:
IP 往哪里发
4.数据链路层: 加密 编译 编解码
字节
5.物理层: 硬件(光纤 光缆 双绞线 电信号 光信号)
三.IP
IP地址是由网络地址与主机地址两部分所组成(例如:127.0.0.1 这个表示的是当前主机的IP地址,在192.168.13.1中,192.168.1为网络地址。主机地址位于IP地址的后段,用来标识具体设备。同一台网络设备具有唯一的IP地址(IP地址唯一,并且用于标识计算机是哪台)在IP地址192.168.13.1中,1是主机地址。同时IP地址又分为两个版本 ipv4和ipv6,其中 ipv4 位32(4*8)位 ,一共有4个字节,每段字节有8个bit位)
IP地址的作用 :IP地址 为了区分网络中主机 本质是个整数.IP地址是用来识别网络上的设备。
四. 大小端
**大端和小端实际上是字节顺序与存储地址顺序相对应的两种模式**
网络服务器 采取 大端系统
PC机 采取 小端系统
小端系统
小端系统
低位数据在低地址上
大端系统
高位数据在低地址上
网络传输字节序列
RFC1700规定使用“大端”字节序为网络字节序,pc机发送数据的时候必须要将自己的主机字节序转换为网络字节序(即“大端”字节序),接收到的数据再转换为自己的主机字节序。这样就与CPU、操作系统无关了,实现了网络通信的标准化
五.网口 子网掩码(为了得到某一段IP地址)
192.168.1.200 字符串
4字节 4*8 个比特位 范围 0 - 255
端口:
为了在一台主机中 区分不同程序,不同进程
协议
约定的规则
共有协议 : 全世界通用
私有协议 : 某些公司或者个人使用
六. TCP(这里就只讲解编程模型,更多原理请关注计算机网络模块)
Tcp编程模型
Sever Cilent
1.创建socket 1.创建socket
2.确定服务器协议地址簇 2.获取服务器协议地址簇
3.绑定 3.连接服务器
4.监听 4.通信
5.接受客户端链接 5.断开连接
6.通信
7.断开连接
Cilent端代码
#include <iostream>
#include <WinSock2.h>
#include <winsock.h>
#include <string.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")
#pragma warning(disable:4996)
using namespace std;
int main() {
//确认版本号
WORD Wverision = MAKEWORD(2, 2);
WSADATA wsadata = { 0 };
if (WSAStartup(Wverision, &wsadata) != 0) {
cout << "创建失败" << endl;
return 0;
}
//创建Socket
int signalsocket = socket(AF_INET //协议类型
, SOCK_STREAM, //媒介类型
0); //保护方式
//获取服务器地址簇
sockaddr_in addr = { 0 };
addr.sin_family = AF_INET; // 协议簇
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //表示连接的IP
addr.sin_port = htons(22222); //htons 将小端转化为大端
//connect用于连接别人
int len = sizeof(sockaddr_in);
int a = connect(signalsocket, (sockaddr*)&addr, len);//用于进行通信的socket
if (a == SOCKET_ERROR) {
cout << "建立连接失败" << endl;
return 0;
}
//通信
for (int i = 0; i < 100; i++)
{
char buff[1024] = {0};
sprintf(buff, "%d", i);
send(signalsocket, buff, strlen(buff), 0);
}
//断开连接
closesocket(a);
closesocket(signalsocket);
}
Sever端代码
#include <iostream>
#include <WinSock2.h>
#include <winsock.h>
#include <string.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")
#pragma warning(disable:4996)
using namespace std;
int main() {
//确认版本号
WORD Wverision = MAKEWORD(2, 2);
WSADATA wsadata = { 0 };
if (WSAStartup(Wverision, &wsadata) != 0) {
cout << "创建失败" << endl;
return 0;
}
//创建Socket
int signalsocket = socket(AF_INET //协议类型
,SOCK_STREAM, //媒介类型
0); //保护方式
//确认服务器地址簇
sockaddr_in addr = { 0 };
addr.sin_family = AF_INET; // 协议簇
addr.sin_addr.S_un.S_addr = inet_addr("0.0.0.0"); //表示接受任何IP地址的访问 inet_addr()将字符串转成整数
addr.sin_port = htons(22222); //htons 将小端转化为大端
//绑定
int s = bind(signalsocket,(sockaddr*)&addr,sizeof(addr));
if (s == -1) {
cout << "绑定失败"<<endl;
}
else
{
cout << "绑定成功" << endl;
}
//监听
listen(signalsocket,10);
//接受客户端通信
int len = sizeof(sockaddr_in);
int cilentsocket = accept(signalsocket,(sockaddr*)&addr,&len);
if (cilentsocket == -1) {
cout << "接受失败" << endl;
}
else
{
cout << "链接成功" << endl;
}
//通信
while (1)
{
char buff[1024];
int r = recv(cilentsocket, buff, 1024, 0);
if (r > 0) {
buff[r] = 0;
cout << buff << endl;
}
}
//断开连接
closesocket(cilentsocket);
closesocket(signalsocket);
return 0;
}``