Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1296376
  • 博文数量: 436
  • 博客积分: 7854
  • 博客等级: 少将
  • 技术积分: 3225
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-18 16:30
文章分类

全部博文(436)

文章存档

2013年(2)

2012年(56)

2011年(70)

2010年(308)

分类:

2010-06-30 20:34:39

作为TCP/IP核心的TCPUDPIP等中下层协议,向外提供的只是原始的编程界面,而不是用户直接的调用服务。TCP/IP应用程序编程接口实际上就是充当了核心协议和应用程序之间的中介。在网络程序的设计中,发送和接受消息完全是由套接字(socket)来完成的。

套接字(socket)是一种进程间通信机制,就好像UNIX环境中的管道、共享内存、信号和WINDOWS环境中的DDE机制一样,socket提供了进程间进行通信、相互作用的一种方法,并将这种进程间通信从单机环境扩展到网络环境。

套接字基本上有三种类型,分别是数据流套接字、数据报套接字和原始套接字。下面我们就分别详细学习它们。

1、数据流套接字(Stream Socket

数据流式是一种面向连接的Socket,针对于面向连接的TCP服务应用,使用使用比较高质量的TCP协议。它有以下一些特点:

1 TCP提供可靠的连接。当TCP向另外一端发送数据时,它要求对方返回一个确认回答。如果没有收到确认,则会等待一段时间后重新发送,在数次重发失败后,TCP才会放弃发送。

2 TCP为发送的数据进行排序。比如发送2048个字节,TCP可能将它分成大小为1024的两个段,并分别进行编号“1”和“2”。接收段将根据编号对数据进行重新排序并判断是否为重复数据。

3 TCP提供流量控制。它会通知对方自己能够接受数据的容量,称为窗口,这样就确保不会发生缓冲区溢出的情况。

4 TCP的连接是双工的。在给定连接上的应用进程在任何时刻既可以发送也可以接受数据。

TCP中相当重要的一个概念就是建立一个TCP连接,也就是三次握手过程,理解它对于今后编程有非常大的帮助。下面我们就详细学习一下这个过程。

1 服务器必须准备好接收外来的连接。由调用socketbindlisten函数完成,称为被动打开(passive open)。

2 客户通过调用connect进行主动打开(active open)。客户TCP发送一个SYN(同步)包,以告知服务器客户在这次连接中要发送数据的初始序列号。SYN数据包不包含数据,只有一个IP头、一个TCP头及其选项。

3 服务器确认客户的SYN,同时自己也发送一个SYN数据包,告知客户它自己在这次连接中发送数据的初始序列号。服务器分别对客户SYN的应答ACK,以及自己的SYN数据。

4)客户返回对服务器SYN的确认应答ACK

许多广泛应用的程序都使用数据流套接字,比如telnetWWW浏览器使用的HTTP协议等。

2、数据报套接字(Datagram Socket

数据报式Socket是一种无连接的套接字,对应于无连接的UDP服务应用,相应协议是UDP

UDP提供无连接的服务,就是说UDP客户与服务器不必保持长期的连接关系。例如,一个UDP客户可以创建一个套接字并发送一个数据报给一个服务器,然后可以立即用同一个套接字发送另一个数据报给另一个服务器。UDP所面临的问题就是缺乏可靠性。因为它没有例如确认、超时重传等复杂机制,因此它不能保证数据的到达以及到达的次序。

那么我们在传送过程中,如果数据丢失了该怎么办呢?其实每个程序在UDP上都有自己的协议,如果在一定时间内没有收到对方发回的确认应答,它将重新发送,直到得到ACK

UDP实现过程比较简单,因此在一定程度上效率较高,对于一些数据量小,无须交互的通信情况还是适用的。使用UDP的应用程序有:tftpbootp等。

3、原始套接字(Raw Socket

除了上面两种常用的套接字类型外,还有一类原始套接字(raw socket),在某些网络应用中担任重要角色。比如我们平时想看一看网络是否通达,就用ping命令测试一下。Ping命令用的是ICMP协议,因此我们不能通过建立一个SOCK_STREAMSOCK_DGRAM来发送这个包,而只能自己亲自来构建ICMP包来发送。另外一种情况是,许多操作系统只实现了几种常用的协议,而没有实现其它如OSPEGGP等协议。如果自己有必要编写位于其上的应用,就必须借助raw socket来实现,这是因为操作系统遇到自己不能够处理的数据包,就将这个包交给raw socket处理。

Raw socket的作用主要在三个方面:

1 通过raw socket来接收和发送ICMP协议包。

2 接收发向本机的但TCP/IP栈不能够处理的IP包。

    (3 用来发送一些自己指定源地址特殊作用的IP包。
阅读(1590) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~