Socket编程
Socket是连接应用程序与网络驱动程序的桥梁。
一、IP地址
IP地址是一个逻辑地址,英特网上的IP地址具有全球惟一性,由32位表示,4个字节,
常用点分十进制的格式表示,如:192.168.1.1
二、协议
为进行网络中的数据交换通信而建立的规则、标准或约定(=语义+语法+规则);
不同层具有各自不同的协议。
三、ISO/OSI七层参考模型
应用层 处理网络应用
表示层 数据表示
会话层 主机间通信
传输层 端到端的连接
网络层 寻址各最短路径
数据链路层 介质访问(接入)
物理层 二进制传输
从低到高各层的功能描述:
1、物理层
提供二进制传输,确定在通信信道上如何传输比特流。
2、数据链路层
提供介质访问,加强物理层的传输功能。
3、网络层
提供IP寻址各路由(网络层负责找出最佳的传输线路)
4、传输层
为源端主机到目的端主机提供可靠的数据传输服务,隔离网络的上下层协议
,使得网络应用与下层协议无关。
5、会话层
在两个相互通信的应用程序之间建立、组织各协调其相互之间的通信。
6、表示层
处理被传送数据的表示问题(即信息的语法和语义)
7、应用层
为用户的网络应用程序提供网络通信的服务。
四、对等层通信的实质(两个端机的相同层之间的通信)
1、对等层实体之间虚拟通信
2、同一个端机的下层向上层提供服务,实际通信是在两个端机的最底层之间完成的
常用协议:
应用层:
Telnet、FTP、HTTP、DNS、SMPT、POP3
传输层:
TCP、UDP
网络层:
网际协议:IP
ICMP、IGMP
五、数据封装
端机在发送数据之前需要将数据打包,在接收数据的时候要拆封。
其中将数据打包的过程就叫封装。
封装:在数据前辈加上特定的协议头部。
如:利用TCP协议传送数据时,当数据到达传输层时,就会加上TCP协议表,当
该数据到达传输层时,就会加上TCP协议头,当该数据到达网络层时,在其前面
就会加上IP协议头。
OSI参考模型中,对等层协议之间交换的信息单元统称为协议数据单元(PDU Protocol
Data Unit)。
数据自上而下递交的过程实际上就是不断封装的过程,到达目的地后自下而上递交的过程
就是不断拆封的过程。
注:某一层只能识别由对等层封闭的“信封”,而对于被封装在“信封”内部的数据,仅仅
是拆封后将其交给上层。
六、TCP/IP模型
对应ISO/OSI
应用层 应用层、表示层、会话层
传输层 传输层
网络层 网络层
网络接口层 数据链路层、物理层
七、端口
为了标识通信实体中进行通信的进程(应用程序),TCP/IP协议提出了协议端口(
Protocol Port 简称端口)。
端口:是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。
应用程序通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被
相应的进程所接收,相应进程发给传输层的数据都通过该端口输出。
端口号:用来惟一标识端口的东东。
端口号与协议相关:使用不同协议的不同的网络应用程序,可以拥有相同的端口号。
端口号:16位二进制表示(0~2^16-1) 0~65535,1024以下的端口号保留给预定
义的服务。
注:我们在编写网络应用程序时,要为程序指定1024以上的端口号。
八、Socket(套接字)的引入
套接字存在于通信区域中,通信区域也叫地址族。
通信区域是一个抽象的概念,主要用将通过套接字通信的进程的共有特性综合在一起。
Socked通常只与同一区域的套接字交换数据。
注:Windows Socket只支持一个通信区域:网际域(AF_INET),这个域被使用
网际协议簇通信的进程使用。
九、网络字节顺序
不同的计算机存放多字节值的顺序不同,
有的机器在起始地址存放低位字节(低位先存)
有的机器在起始地址存放高位字节(高位先存)
基于Intel CPU的PC,采用的是低位先存。
为保证数据传输的正确性,在网络协议中需要指定网络字节顺序。TCP/IP协议使用
16位整数和32位整数的高位先存格式。
所以在网络中不同的主机间进行通信时,要统一采用网络字节顺序。
十、Windows Sockets的实现
Windows Sockets是Microsoft Windows的网络程序设计接口,通常以动态链接库的形
式提供使用,与协议无关并向下兼容,可以使用任何底层传输协议提供的通信能力。
套接字的类型
1、流式套接字(Sock_STREAM)
提供面向连接,可靠的数据传输服务,数据无差错,无重复的发送,且按发送顺序
接收(实际上是基于TCP协议实现的。)
2、数据报式套接字(Sock_DGRAM)
提供无连接服务(基于UDP协议实现的)
3、原始套接字(Sock_RAW)
十一、基于TCP(面向连接)的Socket的编程
基于TCP(面向连接)的Socket编程的服务器端程序流程:
1、创建套接字(Socket)
2、将套接字绑定到一个本地地址和端口上(bind)
3、将套接字设为监听模式,准备接收客户请求(Listen)
4、等待客户请求到来;发请求到来后,接受连接请求,返回一个新的对应于此次连接
的套接字(Accept)
5、用返回的套接字和客户端进行通信(Send/recv)
6、返回,等待另一客户请求
7、关闭套接字
基于TCP(面向连接)的Socket编程的客户端的程序流程:
1、创建套接字(Socket)
2、向服务器发出连接请示(Connect)
3、和服务器端进行通信(Send/recv)
4、关闭套接字
十二、基于UDP(面向无连接)的Socket编程
服务器端也叫接收端,接收端程序的编写:
1、创建套接字(Socket)
2、将套接字绑定到一个本地地址和端口(bind)
3、等待接收数据(recvfrom)
4、关闭套接字
客户端程序的编写
1、创建套接字(Socket)
2、向服务器发送数据(sendto)
3、关闭套接字