1、第八章 网络基础和SOCKET,本章目标,了解TCP/IP协议族 了解TCP和UDP协议的优缺点 掌握TCP三次握手 掌握SOCKET TCP通信过程中SOCKET API函数调用次序 掌握SOCKET UDP通信过程中SOCKET API函数调用次序,远程通信的基础,通信双方 双方共同约定和遵循的协议,A机,B机,约定/协议,异地进程通信,协议层为双方的主机上通信进程分配“端口”和缓冲区,以便异地进程间的通信 协议层:类似于物流公司 端口:类似于物流公司两地的加盟点 缓冲区:类似于加盟点的囤放货物平台,想象下我们如何发送货物给对方呢?,TCP/IP协议概述,TCP/IP是互联网的基础 OSI
2、参考模型与TCP/IP参考模型,图1 OSI参考模型与TCP/IP参考模型对应关系,图2 OSI参考模型与TCP/IP参考模型对应关系,TCP/IP协议族,TCP/IP 实际上是一个一起工作的通信家族,为网际数据通信提供通路。为讨论方便可将 TCP/IP 协议组大体上分为三部分: 1Internet 协议(IP) 2传输控制协议(TCP)和用户数据报文协议(UDP) 3处于TCP 和UDP 之上的一组协议专门开发的应用程序。它们包括:TELNET,文件传送协议(FTP),域名服务(DNS)和简单的邮件传送程序(SMTP)等许多协议。,应用层协议: Telnet 文件传送协议(FTP 和TFTP
3、) 简单的文件传送协议(SMTP) 域名服务(DNS)等协议。,应用层协议,网络编程基础,socket概述 为了简化开发通信程序的工作,由Berkely学校开发了一套网络通信程序的API函数标准 socket标准被扩展成window socket和unix socket linux中的网络编程通过socket接口实现。Socket既是一种特殊的IO,它也是一种文件描述符。一个完整的Socket 都有一个相关描述协议,本地地址,本地端口,远程地址,远程端口;每一个Socket 有一个本地的唯一Socket 号,由操作系统分配。,流式套接字(SOCK_STREAM) 流式的套接字可以提供可靠的、面
4、向连接的通讯流。它使用了TCP协议。TCP 保证了数据传输的正确性和顺序性。 数据报套接字(SOCK_DGRAM) 数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错。使用数据报协议UDP协议。 原始套接字。 原始套接字允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。,SOCKET分类,套接字地址结构,struct sockaddrunsigned short sa_family; /* address族, AF_xxx */char sa_data14; /* 14 bytes的协议地址 */ ;sa_family
5、一般来说, IPV4使用“AF_INET”。sa_data 包含了一些远程电脑的地址、端口和套接字的数目,它里面的数据是杂溶在一起的。,sockaddr_in地址结构,struct sockaddr_in short int sin_family; /* Internet地址族 */unsigned short int sin_port; /* 端口号 */struct in_addr sin_addr; /* Internet地址 */unsigned char sin_zero8; /* 添0(和struct sockaddr一样大小)*/ ;这两个数据类型是等效的,可以相互转换,通常使用
6、sockaddr_in更为方便,字节序列转换,因为每一个机器内部对变量的字节存储顺序不同(有的系统是高位在前,底位在后,而有的系统是底位在前,高位在后 ),而网络传输的数据大家是一定要统一顺序的。所以对与内部字节表示顺序和网络字节顺序不同的机器,就一定要对数据进行转换。,htons()“Host to Network Short” 主机字节顺序转换为网络字节顺序(对无符号短型进行操作2bytes)htonl()“Host to Network Long” 主机字节顺序转换为网络字节顺序(对无符号长型进行操作4bytes)ntohs()“Network to Host Short” 网络字节顺序
7、转换为主机字节顺序(对无符号短型进行操作2bytes)ntohl()“Network to Host Long ” 网络字节顺序转换为主机字节顺序(对无符号长型进行操作4bytes),字节转换函数,地址格式转换,linux提供将点分格式的地址转于长整型数之间的转换函数。 inet_addr()能够把一个用数字和点表示IP 地址的字符串转换成一个无符号长整型。 inet_ntoa() inet_aton(),基本套接字调用,socket() bind() connect() listen() accept() send() recv() sendto() shutdown() recvfrom() close() getsockopt() setsockopt() getpeername() getsockname() gethostbyname() gethostbyaddr() getprotobyname() fcntl(),基于流套接字的编程流程,课后练习,完成一个CS结构的回显TCP服务器 编写TCP客户端程序 客户端发送什么,服务器立即应答,