Linux环境编程-网络编程(李).ppt

上传人:sh****n 文档编号:6353953 上传时间:2020-02-23 格式:PPT 页数:66 大小:720KB
返回 下载 相关 举报
Linux环境编程-网络编程(李).ppt_第1页
第1页 / 共66页
Linux环境编程-网络编程(李).ppt_第2页
第2页 / 共66页
Linux环境编程-网络编程(李).ppt_第3页
第3页 / 共66页
点击查看更多>>
资源描述
Linux网络编程 2009 12 计算机网络 计算机网络 把分布在不同地理位置上的 具有独立功能的多台计算机 终端及其附属设备 用通信设备和通信线路连接起来 再配以相应的网络软件 以实现计算机资源共享 LAN物理拓扑结构 OSI参考模型 应用层 展示层 会话层 传输层 网络层 数据链路层 物理层 应用层 展示层 会话层 传输层 网络层 数据链路层 物理层 Network 字节序 不同的处理器会使用不同的方式来解释多字节数字 32bit整数 0 x01020304网络字节序就是指大端 01 02 03 04 小端 小尾 大端 大尾 04 03 02 01 低地址 高地址 OSIvsTCP IP 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 应用层 IPv4 IPv6 网络介质层 TCP UDP OSI模型 TCP IP模型 通过路由器连接的两个网络 FTP客户 TCP IP 以太网驱动程序 FTP服务器 TCP IP 令牌环驱动程序 令牌环 以太网驱动程序 令牌环驱动程序 IP FTP协议 TCP协议 IP协议 IP协议 以太网 客户 服务器 数据进入协议栈时的封装 用户数据 用户数据 App头部 用户数据 TCP头部 用户数据 TCP头部 IP头部 用户数据 TCP头部 IP头部 以太网头部 以太网尾部 以太网帧 40 1500字节 FTP客户 TCP IP 以太网驱动程序 TCP段 IP分组 TCP IP协议族概貌 tcpdump mrouted ping traceroute Appl Appl TCP UDP ICMP IGMP IPv4 BPFDLPI 数据链路 ARPRARP UDP 用户数据报协议 UDP提供无连接服务UDP缺乏可靠性支持 应用程序必须实现 确认 超时 重传 流控等UDP面向记录服务 UDP数据报格式 源端口 目的端口 长度 校验和 数据 0 15 31 structudphdr u int16 tsource u int16 tdest u int16 tlen u int16 tcheck TCP 传输控制协议 TCP是面向连接的 TCP提供可靠性 实现了丢失重传 RTT的估算 TCP通过给所发送数据的每一个段管理一个序列号进行排序 TCP提供流量控制和拥塞控制 通告窗口 拥塞窗口 TCP的连接是全双工的 TCP协议数据段格式 HLEN 窗口 序列号 确认号 源端口 目的端口 保留 码位 校验和 紧急指针 选项 填充字节 数据 URG ACK PSH RST SYN FIN 0 15 31 7 首部 数据区 TCP连接的建立 TCP连接的过程 服务器必须准备好接受外来的连接 通过调用socket bind listen函数完成 称为被动打开 客户通过调用connect进行主动打开 这引起客户TCP发送一个SYN分节 告诉服务器客户将在连接中发送的数据的初始序列号 服务器必须确认客户的SYN 同时自己也得发送一个SYN分节 服务器以单个分节向客户发送SYN和对客户的SYN的ACK 客户必须确认服务器的SYN TCP三次握手 客户 服务器 SocketConnect 阻塞 主动打开 Socket bind listen 被动打开 SYNJ SYNK ackJ 1 ackK 1 Accept返回Read阻塞 Connect返回 TCP连接终止 TCP一般用四个分节终止一个连接 某个进程首先调用close 这一端的TCP于是发送一个FIN分节 表示数据发送完毕 主动关闭 另一端称为被动关闭 TCP对接收的FIN分节进行确认 并以文件结束标志传递给应用程序 一段时间后 接收到文件结束标志的应用程序调用close 这也导致向对方发送一个FIN分节 接收到这个FIN分节的原发送方TCP对它进行确认 TCP连接关闭 客户 服务器 Close主动关闭 被动关闭Read返回0 FINM ackN 1 Close ackM 1 FINN 网络中的几类地址 物理地址 即MAC地址逻辑地址 即IP地址端口地址 区分同一台计算机上不同进程 域名地址 方便人类记忆 最终会转换成IP地址 物理地址 48位 24位OUI 24位由厂商分配平面地址 无结构全球唯一局部范围寻址存在于数据链路层 IP地址 IP地址标识着网络一个主机的位置 每个IP地址都是由32位 或128位 组成 分成两部分 网络号 主机号 全球唯一 寻址容易两种表示形式 二进制 计算机内部 点分十进制 便于记忆 IP地址分类 0 NetID 10 110 NetID 1110 MulticastAddress HostID NetID HostID HostID A B C D 8bits 8bits 8bits 8bits 0 127 128 191 192 223 224 239 端口地址 process process process process process process IP地址平面 A机 B机 端口地址 cont TCP和UDP使用16位的端口号 用无符号整型表示 为防止端口使用的混乱 将端口分为以下三类 知名端口 0 1023 由IANA统一控制注册的端口 1024 49151 这些端口虽不由IANA控制 但IANA登记这些端口的使用动态或私有的端口 49152 65535 网络中通信双方 网络中通信双方由以下四元组唯一确定 本地IP地址 本地端口号 远程IP地址 远程端口号 DNS 域名地址 层次名字空间便于记忆和使用计算机通信时无法使用域名地址解析 名字到IP地址的解析 gethostbyname IP地址到域名的解析 gethostbyaddr 客户 服务器例子 WWW服务 互联网 无连接和面向连接的服务器 UDP 无连接交互没有可靠保证依赖下层系统保证程序中应该有相应保障措施TCP 面向连接的交互提供传输可靠性程序要求简单选用UDP的情况下层系统可靠性 例如在局域网环境 应用要求广播或者组播 并发的概念 并发有真正的并发 并行 Parallelism 和表面上的并发 并发 Concurrency 一般采用分时机制 并发模型 并行模型 网络中的并发 单个网络各个机器之间许多成对进程好像独立使用网络资源 通道 机器等 一个计算机系统中存在并发 分时 一组机器上所有的客户之间存在并发 互联网 C1 C2 C4C5 C3 服务器中的并发 单个服务器必须并发处理多个传入请求并发服务器可以让多个远程用户同时使用服务 实现起来比较复杂其余部分主要介绍术语和概念 涉及其它问题 算法 设计 运行规则等在后续各章介绍 互联网 服务器 C1 C3C4 C2 客户软件的并发 要使客户软件并发执行 一般并不需要程序员为此特别花功夫 因此现代操作系统一般允许用户并发地执行客户程序 操作系统的并发功能 多进程操作系统进程的概念 进程定义了一个计算的基本单元 它是一个执行某一个特定程序的实体 它拥有独立的地址空间 执行堆栈 文件描述符等 并发和异步I O 某些OS允许单个线程控制并发的输入输出操作使用select询问操作系统I O设备的情况例子 用户从TCP接收数据并且显示 还允许用户从键盘输入命令控制显示 两个输入 TCP 键盘总是等着一个输入 会阻塞使用select询问输入是否就绪 什么是套接字 TCP IP协议存在于OS中 网络服务通过OS提供在OS中增加支持TCP IP的系统调用 Berkeley套接字如socket connect send recv等 套接字API 来自UNIX系统Berkeley套接字ARPA要求伯克利分校将TCP IP移植到UNIX中需要创建一个接口 便于应用程序使用这个接口进行网络通信尽可能使用现有的系统调用 同时添加新的系统调用支持TCP IP 这个系统被称为BSDUNIX套接字 成为事实上的标准 指明一个协议接口 考虑 接口是专门针对TCP IP 还是可以为其它协议所用呢 方法一 定义专门支持TCP IP通信的一些函数方法二 定义支持一般网络通信的函数 用参数是TCP IP通信作为一种特例Berkeley套接字使用第二种办法 具有通用性 TCP IP是一个族PF INET使用服务的类型 而不是指定协议名争论 通用性没有必要 使应用程序难以阅读通用性可以使程序员免于了解协议族的细节 套接字 描述符 OS将文件描述符实现为一个指针数组 指向一个内部的数据结构 进程描述符表的下标套接字和文件类似 每个活动套接字使用一个小整数标识 进程的文件描述符和套接字描述符值不能相同socket函数 创建套接字描述符 不是open函数 0 1 2 3 进程的文件描述符表 一个进程一张 用于文件0的内部数据结构 用于文件1的内部数据结构 用于文件2的内部数据结构 用于文件3的内部数据结构 针对套接字的系统数据结构 调用socket将创建一个新的描述符条目结构的许多字段是其他的系统调用来填 0 1 2 3 4 描述符表 一个进程一张 family PF INET service SOCK STREAM LocalIP RemoteIP Localport Remoteport 主动套接字和被动套接字 创建方式相同 使用方式不同等待传入连接的套接字 被动 如服务器套接字发起连接的套接字 主动 如客户套接字指明端点地址 创建时不指定 使用时指明TCP IP需要指明协议端口号和IP地址TCP IP协议族 PF INET 套接字API intsocket intdomain inttype intprotocol 功能 创建一个新的套接字 返回套接字描述符参数说明 domain 域类型 指明使用的协议栈 如TCP IP使用的是PF INETtype 指明需要的服务类型 如SOCK DGRAM 数据报服务 UDP协议SOCK STREAM 流服务 TCP协议protocol 一般都取0举例 s socket PF INET SOCK STREAM 0 套接字API intconnect intsockfd structsockaddr server addr intsockaddr len 功能 同远程服务器建立主动连接 成功时返回0 若连接失败返回 1 参数说明 sockfd 套接字描述符 指明创建连接的套接字server addr 指明远程端点 IP地址和端口号sockaddr len 地址长度 套接字API structsockaddr sa family tsa family charsa data 14 structsockaddr in sa family tsin family in port tsin port structin addrsin addr typedefuint32 tin addr t structin addr in addr ts addr 套接字API intsend intsockfd constvoid data intdata len unsignedintflags 功能在TCP连接上发送数据 返回成功传送数据的长度 出错时返回 1 send会将外发数据复制到OS内核中 也可以使用send发送面向连接的UDP报文 参数说明 sockfd 套接字描述符data 指向要发送数据的指针data len 数据长度flags 一直为0 套接字API intsendto intsockfd constvoid data intdata len unsignedintflags structsockaddr remaddr intremaddr len 功能 基于UDP发送数据报 返回实际发送的数据长度 出错时返回 1参数说明 sockfd 套接字描述符data 指向要发送数据的指针data len 数据长度flags 一直为0remaddr 远端地址 IP地址和端口号remaddr len 地址长度 intrecv intsockfd void buf intbuf len unsignedintflags 功能 从TCP接收数据 返回实际接收的数据长度 出错时返回 1 服务器使用其接收客户请求 客户使用它接受服务器的应答 如果没有数据 将阻塞 如果收到的数据大于缓存的大小 多余的数据将丢弃 也可以使用recv接收面向连接的UDP的报文参数说明 sockfd 套接字描述符buf 指向内存块的指针buf len 内存块大小 以字节为单位flags 一般为0 intrecvfrom intsockfd void buf intbuf len unsignedintflags structsockaddr from intfromlen 功能 从UDP接收数据 返回实际接收的字节数 失败时返回 1参数说明 sockfd 套接字描述符buf 指向内存块的指针buf len 内存块大小 以字节为单位flags 一般为0from 远端的地址 IP地址和端口号fromlen 远端地址长度举例 recvfrom sockfd buf 8192 0 structsockaddr 套接字API close intsockfd 功能撤销套接字 如果只有一个进程使用 立即终止连接并撤销该套接字 如果多个进程共享该套接字 将引用数减一 如果引用数降到零 则撤销它 参数说明 sockfd 套接字描述符 intbind intsockfd structsockaddr my addr intaddrlen 功能 为套接字指明一个本地端点地址TCP IP协议使用sockaddr in结构 包含IP地址和端口号服务器使用它来指明熟知的端口号 然后等待连接参数说明 Sockfd 套接字描述符 指明创建连接的套接字my addr 本地地址 IP地址和端口号addrlen 地址长度 intlisten intsockfd intinput queue size 功能 面向连接的服务器使用它将一个套接字置为被动模式 并准备接收传入连接 用于服务器 指明某个套接字连接是被动的参数说明 sockfd 套接字描述符 指明创建连接的套接字input queue size 该套接字使用的队列长度 指定在请求队列中允许的最大请求数 intaccept intsockfd void addr int addrlen 功能 获取传入连接请求 返回新的连接的套接字描述符 为每个新的连接请求创建了一个新的套接字 服务器只对新的连接使用该套接字 原来的监听套接字接受其他的连接请求 新的连接上传输数据使用新的套接字 使用完毕 服务器将关闭这个套接字 参数说明 sockfd 套接字描述符 指明正在监听的套接字addr 提出连接请求的主机地址addrlen 地址长度 套接字API中的主要系统调用 read和write在UNIX和Linux中 可以代替recv和send 因为都调用内核的sosend实现 小结 socketconnectsend write recv read closebind listenacceptrecvmsgsendmsgrecvfromsendto shutdowngetpeernamegetsockoptsetsockopt 用于整数转换的实用例程 网络字节顺序 最高位字节在前有些套接字例程要求参数按照网络字节顺序存储 如sockaddr in需要网络字节顺序和本地主机字节顺序进行转换的函数 坚持使用 便于移植 分为短 short16位 和长 long32位 两种htons 将一个短整数从本地字节顺序转换为网络字节顺序 ntohs 将一个短整数从网络字节顺序转换为本地字节顺序 htonl和ntohl 长整数网络字节序和本地字节序之间的转换 在程序中使用套接字调用 使用TCP的客户和服务器套接字函数调用序列 套接符号常量 UNIX系统提供了预定义的符号常量和数据结构来声明数据和指明参数 使用何种服务 SOCK DGRAM 数据报服务 UDP协议SOCK STREAM 流服务 TCP协议PF INET 使用TCP IP协议族AF INET 使用TCP IP地址结构需要include 引用出现这些定义的文本 include include 需要考虑的问题 应用程序必须指明的细节客户还是服务器端点地址使用面向连接的还是无连接的如何执行授权和防护准则所需要的缓存的大小等只需要概念性地了解套接字API需要详细了解构造通信程序的各种方法 便于迅速作出设计决策 客户体系结构 客户应用程序比较简单 不必明显地处理并发性不需要特权 和常规的应用程序一样执行不需要强行保护 依赖操作系统自动强迫执行保护 标识服务器的位置 在编译程序时 将服务器的域名或者IP地址说明为常量执行快 但是服务器移动后不便要求用户在启动程序时标定服务器从稳定的存储设备中获得关于服务器的信息如果文件不存在 客户软件就不能执行使用某个单独的协议来找到服务器只能在本地小环境下应用根据实际情况 综合标识服务器地址 查找域名 使用sockaddr in结构指明服务器的地址需要二进制表示的32bitIP地址套接字对地址转换的支持 两个库例程 inet pton IP地址点分十进制到二进制的转换接受一个点分十进制表示的字符串地址 返回一个等价的二进制地址gethostbyname 主机域名到二进制的转换接受一个机器域名字符串 返回一个hostent结构 内含一个二进制表示的主机IP地址 TCP客户算法 面向连接的客户 找到期望与之通信的服务器IP地址和协议端口号分配套接字指明此连接需要在本地机器中的 任意的 未使用的协议端口 并允许TCP选择一个这样的端口将这个套接字连接到服务器使用应用级协议与服务器通信关闭连接 UDP客户的编程 找到期望与之通信的服务器IP地址和协议端口号分配套接字指明这种通信需要本地机器中的 任意的 未使用的协议端口 并允许UDP选择一个这样的端口指明报文所要发往的服务器使用应用级协议与服务器通信关闭连接 连接和非连接的UDP套接字 连接的UDP通信客户使用connect调用指明远程端点地址使用SOCK DGRAM类型的套接字不发起任何分组交换 不检查远程端点合法性只是在套接字的数据结构记录远程端点的信息不用重复指明远端地址收发报文只和一个服务器交互比较方便非连接的UDP通信在每次发送报文的时候指明远程目的地使用灵活 便于同不同的服务器通信 使用UDP和服务器通信 对于连接的UDP套接字使用send发送报文使用recv接收报文每次send发送一个完整的报文每次recv接受一个完整的报文 足够大缓存不需要重复使用recv获得单个报文对于非连接的UDP套接字sendto 发送报文 含有地址信息recvfrom 接收一个含有源地址的数据报 关闭UDP套接字和UDP特点 close 关闭套接字 释放与之关联的资源拒绝以后到达的报文没有通知远程端点shutdown 在某个方向上终止进一步传输不向另外一方发送任何报文 只是在本地套接字标明不期望在指定的方向传输数据客户关闭输出以后 服务器并不知道UDP提供的是不可靠的交互必须自己设计协议实现可靠性 典型TCP服务器 intlisten fd connect fd structsockaddr inserv addr client addr listen fd socket PF INET SOCK STREAM 0 bzero 获得连接fd 发送和接收数据 典型TCP客户端 intsocket fd structsockaddr inserv addr socket fd socket PF INET SOCK STREAM 0 bzero 向服务器发起连接请求 发送和接收数据 作业 用套接字实现一个聊天程序 要求客户端和服务器端能输入聊天内容且显示内容 写一个服务端程序 接受客户端连接 客户端连接成功后 接收客户端的请求 若客户端的请求为 gettime r n 则返回服务器上的时间 时间格式为 yyyymmddhh mm ss r n 写一个客户端程序 连接到上题中服务端 发送 getime 请求 获取服务器时间 并将本机的时间设置为与服务器时间相同 根据TFTP协议实现TFTP客户端与服务端
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!