Linux系统编程第4章Socket网络编程戴瑾daijin.njujl@gmail.com南大金陵学院信息科学与工程系2目录网络编程协议基础Socket基本编程技术Socket高级编程技术3OSI模型与TCP/IP协议栈网络编程协议基础4OSI七层协议功能物理层面向物理传输媒体,屏蔽媒体的不同主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的模数转换与数模转换)。这一层的数据叫做比特。链路层面向一条链路,成帧和无差错传输主要将从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。网络层分配地址、面向多条链路、路由和流量控制要将从下层接收到的数据进行IP地址(例192.168.0.1)的封装与解封装。在这一层工作的设备是路由器,常把这一层的数据叫做数据包。传输层面向两台主机通信,处理可靠传输细节,无差错、无失序传输定义了一些传输数据的协议和端口号(等),如:TCP(传输控制协议),UDP(用户数据报协议)。主要是将从下层接收的数据进行分段进行传输,到达目的地址后在进行重组。会话层面向一次会话,协调双方的交互、同步主要在你的系统之间发起会话或或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)表示层面向通信内容的表示,大家认同的描述方式主要是进行对接收的数据进行解释、加密与解密、压缩与解压缩等(也就是把计算机能够识别的东西转换成人能够能识别的东西(如图片、声音等))应用层面向建立在通信基础上的应用,为应用提供通信服务,主要是一些终端的应用,比如说FTP(各种文件下载),WEB(IE浏览),QQ之类的(你就把它理解成我们在电脑屏幕上可以看到的东西.就是终端应用)网络编程协议基础5TCP协议特点面向连接的可靠传输端到端、建立/断开连接正确、顺序传送数据协议关注问题IP数据报的丢失、重复、失序、延迟发送和接收速度的匹配系统重启动,一方连接信息丢失网络拥塞网络编程协议基础6UDP协议特点无连接不需要在通信前建立连接不使用控制报文传输开销低面向报文不将报文分割,也不合并UDP报文大小直接影响网络利用率过小造成报头比率过大过大造成MTU分片尽力而为、任意交互一对一、一对多、多对一和多对多网络编程协议基础7网络服务的标识TCP/UDP端口号作为服务器程序标识服务器启动时,首先在本地主机注册所使用的TCP/UDP端口号客户通过与服务器指定的TCP端口建立连接(或直接向服务器指定的UDP端口发送信息)来访问特定服务运行服务器程序的主机收到信息后,将其转交给注册该端口的服务器程序处理网络编程协议基础8客户/服务器交互模型服务器程序被动等待请求并做出响应客户程序主动向服务器发出服务请求网络编程协议基础9客户/服务器程序特性对比网络编程协议基础10服务器请求处理流程—循环服务器方案系统资源要求不高在处理一个请求时其他请求必须等待主要针对于面向无连接的客户/服务器模型网络编程协议基础11服务器请求处理流程—并发服务器方案系统资源要求较高实时性和灵活性是该方案的最大特点主要针对于面向连接的客户/服务器模型网络编程协议基础12Linux的网络分层结构BSDSocket是通用接口,支持各种网络工作形式INETSocket支持包括TCP/IP协议在内的Internet地址族网络应用BSDSocket层INETSocket层TCPUDPIPPPPSLIPSocketARP用户数据界面接口界面协议分层网络驱动网络编程协议基础13目录网络通信协议基础Socket基本编程技术Socket高级编程技术14socket基本概念Socket接口是应用程序与TCP/IP协议栈的接口定义一组函数/例程,支持TCP/IP网络应用程序开发与数据通信相关的系统调用是read()/write()是一种文件描述符一个套接字描述一个通信连接的一端两个通信程序中各自有一个套接字来描述自己的Socket不是TCP/IP标准的组成部分,但已成为事实上的工业标准UNIX系列系统提供SocketWindows系列、Macintosh系列、Solaris等亦提供网络编程协议基础15Socket端到端通信的形式形式(IP,PORT)网络进程标识协议,本地地址,本地端口网间通信标识协议,本地地址,本地端口,远程地址,远程端口端口分类公认端口:从0到1023小于256的端口作为保留端口注册端口:端口号从1024到49151.动态和/或私有端口:从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从1024起分配动态端口。Socket基本编程技术16基本socketAPIsocket()创建一个新的Socketclose()关闭一个Socketbind()将服务器(IP,Port)赋予Socketlisten()等待到来的客户连接请求(TCP)accept()接受客户连接请求并建立连接(TCP)connect()向服务器发出连接请求send()/recv()发送/接收数据Socket基本编程技术17字节顺序字节顺序大端模式(bigendian):高字节放到高地址上小端模式(littleendian):高字节放到低地址上主机字节顺序(HBO,HostByteOrder)不同的机器HBO不相同,与CPU设计有关Motorola68k系列,HBO与NBO相同Intelx86系列,HBO与NBO相反网络字节顺序(NBO,NetworkByteOrder)使用统一的字节顺序,避免兼容性问题解决兼容性问题途径往网络上发送前:转换成网络字节序从网络接收数据:转换成主机字节序Socket基本编程技术18字节顺序转换函数头文件#includenetinet/in.h函数原型uint32_thtonl(uint32_thostlong);把32位值从主机字节序转换成网络字节序uint16_thtons(uint16_thostshort);把16位值从主机字节序转换成网络字节序uint32_tntohl(uint32_thostlong);把32位值从网络字节序转换成主机字节序uint16_tntohs(uint16_thostshort);把16位值从网络字节序转换成主机字节序说明h代表host,n代表networks代表short,l代表longSocket基本编程技术19socket()函数功能创建一个套接字#includesys/socket.h函数原型intsocket(intdomain,inttype,intprotocol);参数说明domain:通信协议族,即地址族type:套接字类型protocol:通信协议常设置为0,由内核根据指定的类型和协议族使用默认的协议返回值成功时,返回一个大于等于0的文件描述符失败时,返回一个小于0的值Socket基本编程技术20Linux支持的协议和地址族地址协议协议描述AF_UNIXPF_UNIXUnix域AF_INETPF_INETTCP/IP(V4)AF_INET6PF_INET6TCP/IP(V6)AF_AX25PF_AX25业余无线电使用的AX.25AF_IPXPF_IPXNovell的IPXAF_APPLETALKPF_APPLETALKAppleTalkDDSAF_NETROMPF_NETROM业余无线电使用的NetRomSocket基本编程技术21套接字类型流套接字(SOCK_STREAM)可靠的、面向连接的通信使用TCP协议数据报套接字(SOCK_DGRAM)无连接服务使用UDP协议原始套接字(SOCK_RAW)允许对底层协议(如IP、ICMP)直接访问Socket基本编程技术22socket()函数代码框架intmain(){……intsockfd;if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror(“socket”);exit(1);}……}Socket基本编程技术23套接字选项函数原型intgetsockopt(intsockfd,intlevel,intoptname,void*optval,socklen_t*optlen)intsetsockopt(intsockfd,intlevel,intoptname,constvoid*optval,socklen_t*optlen)功能控制套接字行为,如修改缓冲区大小、传输方式等参数说明level:指定控制套接字的层次SOL_SOCKET:通用套接字选项IPPROTO_IP:IP选项IPPROTO_TCP:TCP选项optname:指定控制方式(选项名称)optval:获得/设置套接字选项值Socket基本编程技术24SOL_SOCKET参数选项SO_BROADCAST允许发送广播数据intSO_DEBUG允许调试intSO_DONTROUTE不查找路由intSO_ERROR获得套接字错误intSO_KEEPALIVE保持连接intSO_LINGER延迟关闭连接structlingerSO_OOBINLINE带外数据放入正常数据流intSO_RCVBUF接收缓冲区大小intSO_SNDBUF发送缓冲区大小intSO_RCVLOWAT接收缓冲区下限intSO_SNDLOWAT发送缓冲区下限intSO_RCVTIMEO接收超时structtimevalSO_SNDTIMEO发送超时structtimevalSO_REUSERADDR允许重用本地地址和端口intSO_TYPE获得套接字类型intSO_BSDCOMPAT与BSD系统兼容intSocket基本编程技术25IPPROTO_IP与IPPRO_TCP参数选项IPPROTO_IPIP_HDRINCL在数据包中包含IP首部IP_OPTINOSIP首部选项IP_TOS服务类型IP_TTL生存时间IPPRO_TCPTCP_MAXSEGTCP最大数据段的大小TCP_NODELAY不使用Nagle算法Socket基本编程技术26套接字选项示例更改发送/接收缓冲区大小接收缓冲区intnRecvBuf=32*1024;//设置为32Ksetsockopt(s,SOL_SOCKET,SO_RCVBUF,(constvoid*)&nRecvBuf,sizeof(int));发送缓冲区intnSendBuf=32*1024;//设置为32Ksetsockopt(s,SOL_SOCKET,SO_SNDBUF,(constvoid*)&nSendBuf,sizeof(int));说明对于客户,SO_RCVBUF选项必须在connect之前设置对于服务器,SO_RCVBUF选项必须在listen前设置Socket基本编程技术27bind()函数功能将套接字地址与所创建的套接字号联系起来客户端如果只想使用connect(),则无须使用该函数#includesys/socket.h函数原型intbind(intsockfd,structsockaddr*my_addr,socklen_taddrlen);参数说明sockfd:调用socket返回的文件描述符my_addr:保存地址信息(IP地址和端口)addrlen:设置为sizeof(structsockaddr)返回值成功时,返回0失败时,返回-1Socket基本编程技术28sockaddr结构