1.套接字(socket)
一个完整的网络应用程序包括客户端和服务器两个部分。网间通信进程需要由两个进程组成,并且只能用同一种协议。也就是说,不能在通信的一端使用TCP协议,而另一端则用UDP协议。一个完整的网络通信需要一个五元组来标识:协议、本地地址、本地端口号、远端地址、远端端口号。
应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与Tcp,Udp协议交互提供了称为套接字(socket)的接口。套接字是一个通信终结点,它是Sockets应用程序用来在网络上发送或接收数据包的对象。套接字具有类型,与正在运行的进程相关联,并且可以有名称。使用套接字的应用程序间通信模型如图所示。
在网络上,一个套接字由一个IP地址和一个端口号唯一确定。套接字的地址指该套接字所在计算机的网络地址,可以为域名或IP地址的形式。同一计算机上可以运行多个网络应用程序,每个应用程序都有自己的套接字用以进行网络通信,此时如果只有地址标识套接字,则当一个通信包到达计算机时,将无法确定究竟是哪个应用程序的套接字需要接收此信息。由此增加了端口的概念,以协助区分同一计算机上不同应用程序的套接字。端口用于标识进程,同一计算机上不同的网络应用程序各有不同的端口,这样,通过“网络地址+端口号”的标识方法,便唯一标识了计算机上的应用程序了I,刀。某些端口是专门为公共服务保留的,如FtP:21,httP:80,除非程序是要提供这些服务,否则应避免使用这些端口。一般来说,端口1024以前的端口号都是系统保留的或是作为公共服务的,应尽量选择大于1024的端口号,以避免冲突。套接字一般分为三种类型:
①流式套接字(SOCK--STREAM):该类套接字提供了面向连接的、可靠的、数据无错并且无重复的数据发送服务。而且发送的数据是按顺序接收的。所有利用该套接字进行传递的数据均被视为连续的字节流的并且无长度限制。这对数据的稳定性、正确性和发送/接受顺序要求严格的应用十分适用,TCP使用该类接口。
②数据报式套接字(SOCK--DGRAM):数据报式套接字提供了面向无连接的服务,不提供正确性检查,也不保证各数据包的发送顺序,因此,可能出现数据的重发、丢失等现象,并且接收顺序由具体路由决定。然而,与流式套接字相比,使用数据报式套接字对网络线路占用率较低。在TCP月P协议组中,UDP使用该类套接字。
③原始套接字(SOCK--RAw):该套接字一般不会出现在高级网络接口的现中,因为它是直接针对协议的较低层(如IP、TcP、UDP等)直接访问的。用于检验新的协议实现或访问现有服务中配置的新设备,使用原始套接字存在络应用程序的兼容性问题,所以一般不推荐使用原始套接字。
TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。
这里有一张图,表明了这些协议的关系。
Socket在哪里呢?
在图1中,我们没有看到Socket的影子,那么它到底在哪里呢?还是用图来说话,一目了然。
Socket是什么呢?
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
socket 服务器端和客户端通信,面向TCP的使用步骤:
服务器端步骤:
1、创建用于监听的套接字(socket)
2、将套接字绑定到本地地址和端口上(bind)
3、将套接字设为监听模式(listen)
4、等待客户请求(accept),此处要不断的调用accept
5、通信(send/receive),完成后返回4
6、关闭套接字(closesocket)
客户端步骤:
1、创建套接字
2、向服务器发送连接请求(connect)
3、通信(send/recv)
4、关闭套接字
http://blog.csdn.net/cxh342968816/article/details/6336914