2014 1 27
=====================================================================
关于网络编程
网络编程在很大程度上就是套接字编程了,包括原始套接字编程。socket编程就几个函数,比较简单掌握。关键点还是对于网络协议的理解。使用的各种网络之间的通信都是基于协议的,只有对协议有了一个充分的理解,然后就可以对网络之间的整个通信过程才可以有一个充分的认识。平常的刷票软件,也是一个基于网络协议的网络通信过程,我们了解了协议就了解了通信过程的整个细节,那么对于实现这样的一个东西就用了思路。而socket以及Win Inet这些网络编程的接口只是在实现的时候有一些用而已了,那是实现的步骤了。
网络应用程序一般使用应用层的协议来进行开发即可,例如HTTP协议,SMTP协议,FTP协议等等。他们可以用来开发Web服务器,邮件服务器以及文件服务器等等。而这些应用程序的协议又是基于它的下一层协议来实现的,即传输层协议为应用程序协议提供支持,网络层协议为传输层协议提供支持,网络接口层协议为网络层协议提供支持。
在一般应用程序的开发中,我们使用最多的就是直接使用应用程序的协议来开发应用程序。网络之间两个端进行通信需要用到传输层概念“端口”,即使是上层协议没有涉及到端口,但是底层已经为它提供了支持。在使用套接字进行编程的过程中,我们需要选择是使用TCP还是UDP哪个传输层协议。我们可以使用传输层下的这两个协议来开发更多的应用层协议,比较经典当然是HTTP,FTP和SMTP了。除了这些,我们可以创造我们自己的通信协议,个人认为,两端复杂一些的通信方式就可以成为是一种协议了,因为“协议”广义上讲就是一种规则,即使它并不为很多人知道,简直要开发者我们知道。即时通讯如今很流行,那么它主要是基于传输层的TCP或UDP协议来开发的,例如QQ。在开发这些程序的过程中主要的三个编程接口也不多,Socket,Win Inet和NetBios。Socket主要是传输层的通信,而Win Inet主要是支持应用层的通信。
而原始套接字并不是使用现成的TCP和UDP协议,它是自己填充IP数据包,TCP数据包,然后发送和接收数据,只要在创建套接字的时候进行相关设置就行了。具体还是做几个测试了再了解。
2014 2 5
对于网络协议的理解,看书的过程,每天都会多一些理解。
每一应用层应用程序就是一钟网络协议,都是基于传输层来进行开发的,一般的传输层协议TCP用的较多。在开发应用层网络协议的过程中,一般都是使用网络编程接口socket。
*******************************************************************************
关于代理服务器
如果浏览器设置了使用代理服务器进行上网,那么浏览器是以什么形式与代理服务器
进行连接的?
有的浏览器没有设置代理服务器,但是在局域网的边界设置了代理服务器,那么当
HTTP/HTTPS流量经过代理服务器的时候,代理服务器就会全权接收说有发给目标服务器
的数据,然后经过加工将该数据发给目标服务器进行上网。
经过上面的分析有了一些猜想:
假如为浏览器设置了使用代理服务器上网,那么当向目标服务器发送HTTP/HTTPS请求的时候,
浏览器会依然会以HTTP协议发送数据,只是把原来要发给目标服务器的数据又进行了包装,
使用的就是HTTP协议,包装主要的目的就是加上了代理服务器的地址(IP和端口),这样
数据包才能发给代理服务器。代理服务器收到数据后会去掉加上的信息,将源数据发给目标
服务器。
假如没有在浏览器中设置代理服务器服务,一些企业或者学校就会在整个局域网的边界设置一个
代理服务器来提供上网的服务。每一台主机在来进行网络访问的时候都会把访问的数据
发给代理服务器,由代理服务器去访问目标服务器。那么为什么每一台主机会自动去访问
代理服务器呢?那就是网络管理员的职责了。
那么如何使用代理服务器呢?
可以自己实现一个代理服务器来尝试一下代理服务器的妙处。也可以自己在网上寻找一些代理服务器来进行各种的处理,例如可以找一个高性能的代理服务器来帮助你上网,那样可以增强你的代理服务器的能力;也可以找一台代理服务器翻墙,越过长城防护墙。
更多的相关代理服务器的问题,进一步会更加深入地进行。
之前实现了一个Web代理服务器,在我的博文HTTP代理服务器的实现中有详细介绍我将来剖析一下它的实现方式:
这个函数主要由4个函数组成:
1.void __cdecl ServerThreadProc(void *param);
这个函数的主要作用就是处理一个IE的连接
2.int TCPsend(SOCKET s,const char*buf,int len,int flags);
这个函数主要负责发送数据
3int TCPrecv(SOCKET s,char *buf,int len,int flags);
这个函数主要负责接收数据
4.Main函数
这个函数负责接收每一个客户端的请求,然后创建线程,调用线程函数进行处理。
程序总体分析:
在这个程序的主函数可以看到,创建的套接字处理等待状态,接收到一个来自客户端的链接
就开始创建一个线程进行处理。这不得不再让我们想起一个问题的答案:代理服务器是以什么形式与客户端建立链接的?现在可以回答了,毋庸置疑客户端肯定是与代理服务器是通过socket来进行连接的。然后发送的HTTP协议流量都会先经过这个代理服务器了。并不是说由浏览器发送给代理服务器的流量是经过浏览器使用HTTP协议再次包装过的,这并不影响代理服务器被客户端找到,因为在发送HTTP流量的之前,客户端(浏览器)已经与代理服务器建立了连接,客户端早就知道要访问的代理服务器的IP以及端口。
整个线程函数所做的事情,就是接收IE浏览器发来的数据,然后解析数据进行日志记录,根据请求的域名获得IP地址和端口号(80)把IE发来的数据转发给Web Server。另外就是接收Web Server发来的数据,解析后进行日志记录,将数据转发给浏览器所对应的套接字。
整个程序的过程:
1.创建代理服务器套接字进行监听
2.代理服务器套接字接收来自客户端的连接,并创建客户端套接字
3.接收客户端的数据并解析出web服务器的地址,把数据转发给web Server
4.接收web 服务器发来的数据,直接发给客户端套接字
程序详解:
见之前的博文内容
2014 2 7
今天研究了一下网络编程,些许心得,记录之。
对于各种网络协议,TCP/UDP , IP , ICMP都具有自己的数据包结构,对一个协议的理解,要深入到这些协议的头部信息的标志位上,分别代表的含义。
在网络上传输的数据包,除去链路层封装的头部信息后就只剩下网络层,传输层以及应用层了。一般我们底层抓包都是在链路层进行抓包(还有待证实,目前只是猜想阶段),也就是在链路层之上,在网络层之下。那么我们面对的包主要是用网络层头部封装和传输层的头部封装,我们已经知道了IP头部和TCP头部(UDP头部)协议的头部结构,那么我们就可以根据每个头部中各个部分字段的大小来获取这个数据包中的相关信息,也就是解析这个包的内容。当然了,知道了每个包的具体内容也就了解了整个包所传达的含义。
在一般的应用程序中传输层协议,TCP协议比UDP协议用的相对广泛一些,协议结构也复杂一些。ICMP协议属于网络层,ping程序就是利用ICMP协议实现的。在网络层,没有端口的概念,只有IP地址。
我们现在抓到一个包,解析它的步骤的第一步就是判断其实什么协议的包,然后每一层取头部信息,最后得到的就是数据了。例如,HTTP数据包,最外面的那层必然是HTTP头部信息了,接着就是TCP协议头部,然后就是网络层IP协议头。最后也就是链路层的协议头,一般情况下是以太网。能够抓到链路层协议的抓包程序肯定就是在链路层下进行抓包了,这是如何实现的,还有待研究。
说道这里,对于网络协议的理解也越来越深刻,不过一定要结合实践编程来理解,那样才能融会贯通,理解的更加透彻,起到举一反三的效果。