套接字有三种类型:流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM)及原始套接字

来源:互联网 发布:淘宝关键词搜索设置 编辑:程序博客网 时间:2024/06/06 17:50

 1.流式套接字(SOCK_STREAM)
    流式的套接字可以提供可靠的、面向连接的通讯流。如果你通过流式套接字发送了顺序的数据:“1”“2”,那么数据到达远程时候的顺序也是“1”“2”。
    流式套接字可以做什么呢?你听说过
Telnet应用程序吗?听过?哦,最常用的BBS服务,以及系统的远程登陆都是通过Telnet协议连接的。Telnet就是一个流式连接。你是否希望你在Telnet应用程序上输入的字符(或汉字)在到达远程应用程序的时候是以你输入的顺序到达的?答案应该是肯定的吧。还有WWW浏览器,它使用的HTTP协议也是通过流式套接字来获取网页的。事实上,如果你Telnet到一个Web Site的80端口上,然后输入“GET网页路径名”然后按两下回车(或者是两下 Ctrl+回车)然后你就得到了“网页路径名”所代表的网页!
    流式套接字是怎样保证这种应用层次上的数据传输质量呢?它使用了TCP(The Transmission Control Protocol)协议(可以参考RFC-793来得到TCP的细节)。TCP保证了你的数据传输是正确的,并且是顺序的。TCP是经常出现的TCP/IP中的前半部分。IP代表Internet Protocol(因特网协议,参考RFC-791)IP只处理网络路由。

    2.数据报套接字(SOCK_DGRAM)
    数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错。原始套接字允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。
    数据报套接字(Datagram Sockets)怎样呢?为什么它叫做“无连接”?应该怎样处理它们呢?为什么它们是不可靠的?好的,这里有一些事实:
    ·如果你发送了一个数据报,它可能不会到达。
    ·它可能会以不同的顺序到达。
    ·如果它到达了,它包含的数据中可能存在错误。
    数据报套接字也使用IP,但是它不使用TCP,它使用使用者数据报协议UDP(User Datagram Protocol可以参考RFC 768)
    为什么说它们是“无连接”的呢?因为它(UDP)不像流式套接字那样维护一个打开的连接,你只需要把数据打成一个包,把远程的IP贴上去,然后把这个包发送出去。这个过程是不需要建立连接的。UDP的应用例子有:tftp, bootp等。
     那么,数据包既然会丢失,怎样能保证程序能够正常工作呢?事实上,每个使用UDP的程序都要有自己的对数据进行确认的协议。比如,TFTP协议定义了对于每一个发送出去的数据包,远程在接受到之后都要回送一个数据包告诉本地程序:“我已经拿到了!(一个“ACK”包)。如果数据包发的送者在5秒内没有的得到回应,它就会重新发送这个数据包直到数据包接受者回送了“ACK”信号。这些知识对编写一个使用UDP协议的程序员来说是非常必要的。
    无连接服务器一般都是面向事务处理的,一个请求一个应答就完成了客户程序与服务程序之间的相互作用。
面向连接服务器处理的请求往往比较复杂,不是一来一去的请求应答所能解决的,而且往往是并发服务器。

    套接字工作过程如下:服务器首先启动,通过调用socket()建立一个套接字,然后调用bind()将该套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接。客户在建立套接字后就可调用connect()和服务器建立连接。连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。最后,待数据传送结束后,双方调用close()关闭套接字。
    3.原始套接字
    原始套接字主要用于一些协议的开发,可以进行比较底层的操作。它功能强大,但是没有上面介绍的两种套接字使用方便,一般的程序也涉及不到原始套接字。


原创粉丝点击