| 
                        副标题[/!--empirenews.page--]
                         大家都是知道在黑客网络攻防中,熟悉网络通信原理很重要,之前我也写过相关文章,只要了解通信过程,就可以利用过程中存在的漏洞进行攻防,那么在实现攻防的时候,作为一名黑客一定要学会网络编程,而网络编程中很重要的一个环节就是"Socket"的学习和使用! 
今天就以本篇文章内容给小伙伴们详细阐述一下"Socket技术原理与实现"。 
一、 什么是"Socket" 
在网络中,根据IP我们可以识别具体的主机,再根据tcp协议+端口我们就可以识别具体主机通讯的进程了;那么socket在其中扮演者什么样的角色呢? 
我们经常把socket定义为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。  下面是网络分层以及socket在分层中的实际位置: 
  
我们可以发现socket就在应用程序的传输层和应用层之间,设计了一个socket抽象层,传输层的底一层的服务提供给socket抽象层,socket抽象层再提供给应用层,问题又来了,应用层和socket抽象层之间和传输层,网络层之间如何通讯的呢,要想理解socket编程怎么通过socket关键词实现和客户端通讯,必须得实现的了解tcp/ip是怎么通讯的,在这个的基础上在去理解socket的握手通讯 
在tcp/ip协议中,tcp通过三次握手建立起一个tcp的链接,大致如下: 
    - 第一次握手:客户端尝试连接服务器,向服务器发送syn包,syn=j,客户端进入SYN_SEND状态等待服务器确认
 
    - 第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态
 
    - 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手
 
 
三次握手如下图: 
  
根据tcp的三次握手,socket也定义了三次握手,如下图: 
  
在上面图的基础上,如果我们得到上面的图形,需要我们自己开发一些接口。所以程序大牛们将这些抽象化的理念接口化,针对协议提出的每个理念,专门的编写制定的接口,与其协议一一对应,形成了现在的socket标准规范,然后将其接口封装成可以调用的接口,供开发者使用,目前,开发者开发出了很多封装的类来完善socket编程,都是更加方便的实现刚开始socket通信的各个环节。 
小结: 
    - socket即为套接字,在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一的标识网络通讯中的一个进程,"IP地址+TCP或UDP端口号"就为socket。
 
    - 在TCP协议中,建立连接的两个进程(客户端和服务器)各自有一个socket来标识,则这两个socket组成的socket  pair就唯一标识一个连接。
 
    - socket本身就有"插座"的意思,因此用来形容网络连接的一对一关系,为TCP/IP协议设计的应用层编程接口称为socket API。
 
 
二、 socket通信基本原理 
通过上面我们理解了socket通讯过程,那我们作为编程需要哪些函数来实现呢,如下: 
    - 第一次握手:客户端需要发送一个syn j 包,试着去链接服务器端,于是客户端我们需要提供一个链接函数
 
    - 第二次握手:服务器端需要接收客户端发送过来的syn J+1 包,然后在发送ack包,所以我们需要有服务器端接受处理函数
 
    - 第三次握手:客户端的处理函数和服务器端的处理函数
 
 
三次握手只是一个数据传输的过程,但是,我们传输前需要一些准备工作,比如将创建一个套接字,收集一些计算机的资源,将一些资源绑定套接字里面,以及接受和发送数据的函数等等,这些功能接口在一起构成了socket的编程 
下面大致的按照客户端和服务端将所需的函数和原理过程: 
  
首先,服务端初始化ServerSocket,然后对指定的端口进行绑定,接着对端口及进行监听,通过调用accept方法阻塞,此时,如果客户端有一个socket连接到服务端,那么服务端通过监听和accept方法可以与客户端进行连接。 
socket通信基本原理明白后,那我们就写一个最简单的示例,来理解通信过程: 
客户端的代码: 
- [cpp]  
 - #include <winsock2.h>  
 - #include <stdio.h>  
 - #pragma comment(lib,"ws2_32.lib")  
 - int main()  
 - {  
 - //SOCKET前的一些检查,检查协议库的版本,为了避免别的版本的socket,并且通过  
 - //WSAStartup启动对应的版本,WSAStartup的参数一个是版本信息,一个是一些详细的细节,注意高低位  
 - //WSAStartup与WSACleanup对应  
 - int err;  
 - WORD versionRequired;  
 - WSADATA wsaData;  
 - versionRequired=MAKEWORD(1,1);  
 - err=WSAStartup(versionRequired,&wsaData);//协议库的版本信息  
 -  
 - //通过WSACleanup的返回值来确定socket协议是否启动  
 - if (!err)  
 - {  
 - printf("客户端嵌套字已经打开! 
 - ");  
 - }  
 - else  
 - {  
 - printf("客户端的嵌套字打开失败! 
 - ");  
 - return 0;//结束  
 - }  
 - //创建socket这个关键词,这里想一下那个图形中的socket抽象层  
 - //注意socket这个函数,他三个参数定义了socket的所处的系统,socket的类型,以及一些其他信息  
 - SOCKET clientSocket=socket(AF_INET,SOCK_STREAM,0);  
 -  
 - //socket编程中,它定义了一个结构体SOCKADDR_IN来存计算机的一些信息,像socket的系统,  
 - //端口号,ip地址等信息,这里存储的是服务器端的计算机的信息  
 - SOCKADDR_IN clientsock_in;  
 - clientsock_in.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");  
 - clientsock_in.sin_family=AF_INET;  
 - clientsock_in.sin_port=htons(6000);  
 -  
 - //前期定义了套接字,定义了服务器端的计算机的一些信息存储在clientsock_in中,  
 - //准备工作完成后,然后开始将这个套接字链接到远程的计算机  
 - //也就是第一次握手  
 -  
 - connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR));//开始连接  
 -  
 -  
 - char receiveBuf[100];  
 -  
 - //解释socket里面的内容  
 - recv(clientSocket,receiveBuf,101,0);  
 - printf("%s 
 - ",receiveBuf);  
 -  
 - //发送socket数据  
 - send(clientSocket,"hello,this is client",strlen("hello,this is client")+1,0);  
 -  
 - //关闭套接字  
 - closesocket(clientSocket);  
 - //关闭服务  
 - WSACleanup();  
 - return 0;  
 - }  
 
  
                                                (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |