通信方式

主要有以下三大类:

(一)SERVER/CLIENT方式:

1.一个Client方连接一个Server方,或称点对点(peer to peer)。
2.多个Client方连接一个Server方,这也是通常的并发服务器方式。
3.一个Client方连接多个Server方,这种方式很少见,主要用于一个客户向多个服务器发送请求情况。

(二)连接方式:

     1.长连接

  Client方与Server方先建立通讯连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在,可以用下面命令查看连接是否建立:

  netstat –f inet|grep 端口号(如5678)。

  此种方式常用于点对点通讯。

  2.短连接

  Client方与Server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此种方式常用于一点对多点通讯,比如多个Client连接一个Server.

(三)发送接收方式:

     1.异步

报文发送和接收是分开的,相互独立的,互不影响。这种方式又分两种情况:

  (1)异步双工:接收和发送在同一个程序中,有两个不同的子进程分别负责发送和接收
  (2)异步单工:接收和发送是用两个不同的程序来完成。

  2.同步

  报文发送和接收是同步进行,既报文发送后等待接收返回报文。同步方式一般需要考虑超时问题,即报文发上去后不能无限等待,需要设定超时时间,超过该时间发送方不再等待读返回报文,直接通知超时返回。

实际方式是这三类方式的组合。比如一般书上提供的/IP范例程序大都是同步短连接的SERVER/CLIENT程序。有的组合是基本不用的,比较常用的有价值的组合是以下几种:

        同步短连接Server/Client  
        同步长连接Server/Client
        异步短连接Server/Client
        异步长连接双工Server/Client
        异步长连接单工Server/Client

其中异步长连接双工是最为复杂的一种方式,有时候经常会出现在不同银行或不同城市之间的两套系统之间的。比如金卡工程。由于这几种方式比较固定,所以可以预先编制这几种方式的模板程序。

二.报文格式

  报文格式多样性更多,相应地就必须设计对应的读写报文的接收和发送报文函数。

  (一)阻塞与非阻塞方式 

  1.非阻塞方式

  读函数不停地进行读动作,如果没有报文接收到,等待一段时间后超时返回,这种情况一般需要指定超时时间。

  2.阻塞方式

  如果没有报文接收到,则读函数一直处于等待状态,直到有报文到达。


  (二)循环读写方式

  1.一次直接读写报文

  在一次接收或发送报文动作中一次性不加分别地全部读取或全部发送报文字节。

  2.不指定长度循环读写

  这一般发生在短连接进程中,受网络路由等限制,一次较长的报文可能在网络传输过程中被分解成了好几个包。一次读取可能不能全部读完一次报文,这就需要循环读报文,直到读完为止。

  3.带长度报文头循环读写

  这种情况一般是在长连接进程中,由于在长连接中没有条件能够判断循环读写什么时候结束,所以必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读报文.实际情况中,报头的码制格式还经常不一样,如果是非ASCII码的报文头,还必须转换成ASCII,常见的报文头码制有:
      (1)n个字节的ASCII码
      (2)n个字节的BCD码
      (3)n个字节的网络整型码

  以上是几种比较典型的读写报文方式,可以与方式模板一起预先提供一些典型的API读写函数。当然在实际问题中,可能还必须编写与对方报文格式配套的读写API.

  在实际情况中,往往需要把我们自己的系统与别人的系统进行连接,有了以上模板与API,可以说连接任何方式的程序都不存在问题。

三,网络通信协议:

网络传输协议:(计算机通信的共同语言)TCP/IP协议、IPX/SPX协议、NetBEUI协议等。在局域网中用得的比较多的是IPX/SPX.。用户如果访问Internet,则必须在网络协议中添加TCP/IP协议。

7      应用层 例如HTTP、SMTP、SNMP、FTPTelnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP

6 表示层 例如XDR、ASN.1、SMB、AFP、NCP

5 会话层 例如ASAP、TLS、SSH、ISO 8327 / CCITT X.225、RPC、NetBIOS、ASP、Winsock、BSDsockets

4 传输层 例如TCP、UDP、RTP、SCTP、SPX、ATP、IL

3 网络层 例如IP、ICMP、IGMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、 X.25

2 数据链路层 例如以太网、令牌环、HDLC、帧中继、ISDN、ATM、IEEE 802.11、FDDI、PPP

1 实体层 例如线路、无线电、光纤

 

(TCP/IP协议有很多层,我们知道的很多协议只是其中的一层。上述红色的,都是咱们比较熟悉的)


1.Socket与TCP/IP与HTTP之间的关系:

HTTP是TCP/IP众多协议中的一种,Socket就是对这些协议进行应用的发射器,标准跟实现之间的关系。

TCP连接的三次握手:

建立连接的时候有三次通讯,断开连接的时候有四次通讯,握手的过程中不涉及到数据的传递(应用数据)。

 

2.建立Socket连接:

 

建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

 

 

3.HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。(http属于短连接的一种)

 

4.运行在TCP协议上的协议:

HTTP(Hypertext Transfer Protocol,超文本传输协议),主要用于普通浏览。

HTTPS(Hypertext Transfer Protocol over Secure Socket Layer, or HTTP over SSL,安全超文本传输协议),HTTP协议的安全版本。

FTP(File Transfer Protocol,文件传输协议),由名知义,用于文件传输。

POP3(Post Office Protocol, version 3,邮局协议),收邮件用。

SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),用来发送电子邮件 。

TELNET(Teletype over the Network,网络电传),通过一个终端(terminal)登陆到网络。

SSH(Secure Shell,用于替代安全性差的TELNET),用于加密安全登陆用。

 

5.运行在UDP协议上的协议:

BOOTP(Boot Protocol,启动协议),应用于无盘设备。

NTP(Network Time Protocol,网络时间协议),用于网络同步。

 

6.其他:

DNS(Domain Name Service,域名服务),用于完成地址查找,邮件转发等工作(运行在TCPUDP协议上)。

ECHO(Echo Protocol,回绕协议),用于查错及测量应答时间(运行在TCPUDP协议上)。

SNMP(Simple Network Management Protocol,简单网络管理协议),用于网络信息的收集和网络管理。

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),动态配置IP地址。

ARP(Address Resolution Protocol,地址解析协议),用于动态解析以太网硬件的地址。

 

 

 

 

4.网络通信涉及到的IO:

 

(1)BIO同步阻塞IO:

从程序上来说,就是当发起IO的读/写的操作时,均为阻塞方式,只有当读到了流或将流写入操作系统后,才会释放资源。

在这个模型中,用户级别的应用程序执行一个系统调用,这会导致应用程序阻塞。这意味着应用程序会一直阻塞,直到系统调用完成为止(数据传输完成或发 生错误)。调用应用程序处于一种不再消费 CPU 而只是简单等待响应的状态。

以read位例,应用程序(application)为了执行这个read操作,会调用相应的一个system call,将系统控制权交给kernel,然后就进行等待(这其实就是被阻塞了)。kernel开始执行这个system call,执行完毕后会向应用程序返回响应,应用程序得到响应后,就不再阻塞,并进行后面的工作。

如上图,“在调用 read 系统调用时,应用程序会阻塞并对内核进行上下文切换。然后会触发读操作,当响应返回时(从我们正在从中读取的设备中返回),数据就被移动到用户空间的缓冲区中。然后应用程序就会解除阻塞(read 调用返回)。”

 

(2)同步非阻塞IO :

NIO是基于事件驱动思想的,实现上通常采用Reactor(http://en.wikipedia.org/wiki/Reactor_pattern)模式,从程序角度而言,当发起IO的读或写操作时,是非阻塞的;当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。对于网络IO而言,主要有连接建立、流读取及流写入三种事件、linux2.6以后的版本使用epoll(http://lse.sourceforge.net/epoll/index.html)方式实现NIO。

select/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。它的流程如图:

当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。
这个图和blocking IO的图其实并没有太大的不同,事实上,还更差一些。因为这里需要使用两个system call (select 和 recvfrom),而blocking IO只调用了一个system call (recvfrom)。但是,用select的优势在于它可以同时处理多个connection。(多说一句。所以,如果处理的连接数不是很高的话,使用select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延迟还更大。select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。)
在IOmultiplexing Model中,实际中,对于每一个socket,一般都设置成为non-blocking,但是,如上图所示,整个用户的process其实是一直被block的。只不过process是被select这个函数block,而不是被socket IO给block。

 

 

(3)AIO,异步IO方式:

AIO为异步IO方式,同样基于事件驱动思想,实现上通常采用Proactor模式(http://en.wikipedia.org/wiki/Proactor_pattern

从程序的角度而言,与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。较之NIO而言,AIO一方面简化了程序出的编写,流的读取和写入都由操作系统来代替完成;另一方面省去了NIO中程序要遍历事件通知队列(selector)的代价。Windows基于IOCP(http://en.wikipedia.org/wiki/Input/output_completion_port)实现了AIO,Linux目前只有基于epoll实现的AIO。

猜你喜欢

转载自lengbingteng-163-com.iteye.com/blog/1540097