首先先看一张计算机网络示意图,如下所示: 这两台计算机要完成一次通信需要具备三个元素,端口号,IP地址,通信协议,下面根据这三个元素展开。
IP地址
IP地址就是通常是点分十进制来表示,形式如“10.111.193.254”,它具有全球唯一性,表示通信身份地址。
通信协议
只有使用相同的规则,两个计算机才能完成网络间的通信,主要有两种协议:一个是国际标准组织定义的OSI七层模型,一个是TCP/IP模型,两个模型如下图所示。
传输控制协议TCPTCP是面向连接的可靠的传输协议,利用TCP协议进行通信时,首先要通过三步握手,以建立通信双方的连接,一旦连接建立好,就可以进行通信了。
TCP提供数据确认和数据重传的机制,保证了发送的数据一定能够到达通信的对方。对于数据完整性要求高的场合,就应该采用TCP协议。比如从网络上下载安装程序。
用户数据报协议UDPUDP是无连接的、不可靠的传输协议。采用UDP进行通信时,不需要建立连接,可以向一个IP地址发送数据,但不能确定一定能收到。
由于UDP协议不需要建立协议,而且没有数据确认和重传机制,因此实时性较高,比如视频会议。
端口号
为了标识通信实体中的应用程序,TCP/IP协议提出了端口的概念,端口号用一个整型标识符来表示,它和协议相关,不同协议有之间端口号是相互隔离的。
端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序通过系统调用与某个端口建立连接(binding)后,传输层传给该端口的数据都被相对应的应用程序所接收;相反的应用程序所发出的数据也从这个端口传出。
我们编写的应用程序的端口号都需要在1024以上,范围是0~65535,1024以下是给预定义的服务使用的。比如http是80端口。
网络字节顺序
由于不同的计算机采用的架构不同,有大端模式和小端模式的,为了在网络中不同主机间进行通信,统一采用网络字节序,也就是大端模式。
客户/服务器模式
在TCP/IP网络应用程序中,通信的两个进程主要采用的模式是客户机/服务器模式(C/S模式);需要服务端先启动,客户端发起请求,先启动的一端叫做服务端,根据请求提供相应的服务。
C/S模式在操作过程中采取的是主动请求模式;首先需要服务器方先启动,根据请求提供不同的服务,总体流程如下:
服务端:
创建一个socket并告诉本地主机,它愿意在某一地址和端口上接收客户请求。等待客户请求到达该接口。接收到重复服务请求,处理该请求并发送应答信号;接收到并发服务请求时,要激活一个新的进程或者线程来处理这个客户请求,这个新进程(或者线程)是针对某个客户的请求,不需要处理其他客户请求。服务完成后,关闭这个进程(或者线程)与客户的通信链路。返回第二步,等待另一个请求到达。客户端:
创建一个socket并设置需要连接到的端口号和IP地址。向服务器发送请求报文,等待并接受应答报文。请求结束后关闭通信链路。套接字
套接字(socket)存在于通信区域中,目前window socket只支持一个通信区域:网际遇(AF_INET);
socket可以认为是一个通信的实体,在客户端需要创建socket,服务器端也需要创建socket;并且C/S模式是一对多的,客户端发起一个请求,服务器接受一个请求后,需要创建新的socket用于本次与客户端的通信,服务器最开始创建的套接字继续用于监听新的请求。
套接字类型
流式套接字(SOCK_STREAM)
提供面向连接、可靠的数据传输服务,数据无差错、无重复的发送,且按照顺序接收。流式套接字是基于TCP协议实现的。
数据报套接字(SOCK_DGRAM)
提供面向无连接服务。数据包以独立包形式发送,不提供无错保证,数据可能丢失或者重复,并且接收顺序不保证顺序。数据报套接字是基于UDP协议实现的。
原始套接字(SOCK_RAW)
我们在使用socket函数创建socket时,type是指套接字的类型。
SOCKET WSAAPI socket( int af, int type, int protocol );