logo资料库

黑马_Linux网络编程-网络基础-socket编程-高并发服务器.docx

第1页 / 共77页
第2页 / 共77页
第3页 / 共77页
第4页 / 共77页
第5页 / 共77页
第6页 / 共77页
第7页 / 共77页
第8页 / 共77页
资料共77页,剩余部分请下载后查看
网络基础
协议的概念
什么是协议
典型协议
网络应用程序设计模式
C/S模式
B/S模式
优缺点
分层模型
OSI七层模型
TCP/IP四层模型
通信过程
协议格式
数据包封装
以太网帧格式
ARP数据报格式
IP段格式
UDP数据报格式
TCP数据报格式
TCP协议
TCP通信时序
滑动窗口 (TCP流量控制)
TCP状态转换
半关闭
2MSL
程序设计中的问题
端口复用
TCP异常断开
心跳检测机制
设置TCP属性
网络名词术语解析
路由(route)
路由器工作原理
路由表(Routing Table)
路由条目
缺省路由条目
路由节点
以太网交换机工作原理
hub工作原理
半双工/全双工
DNS服务器
局域网(LAN)
广域网(WAN)
端口
MTU
常见网络知识面试题
Socket编程
套接字概念
预备知识
网络字节序
IP地址转换函数
sockaddr数据结构
网络套接字函数
socket模型创建流程图
socket函数
bind函数
listen函数
accept函数
connect函数
C/S模型-TCP
server
client
出错处理封装函数
wrap.c
wrap.h
高并发服务器
多进程并发服务器
server
client
多线程并发服务器
server
client
多路I/O转接服务器
select
server
client
pselect
poll
server
client
ppoll
epoll
基础API
server
client
epoll进阶
事件模型
ET模式
LT模式
实例一:
实例二:
server
client
实例三:
server
client
线程池并发服务器
UDP服务器
C/S模型-UDP
server
client
多播(组播)
server
client
socket IPC(本地套接字domain)
server
client
其它常用函数
名字与地址转换
套接口和地址关联
网络基础 协议的概念 什么是协议 从应用的角度出发,协议可理解为“规则”,是数据传输和数据的解释的规则。 假设,A、B 双方欲传输文件。规定: 第一次,传输文件名,接收方接收到文件名,应答 OK 给传输方; 第二次,发送文件的尺寸,接收方接收到该数据再次应答一个 OK; 第三次,传输文件内容。同样,接收方接收数据完成后应答 OK 表示文件内容接收成功。 由此,无论 A、B 之间传递何种文件,都是通过三次数据传输来完成。A、B 之间形成了一个最简单的数据传输 规则。双方都按此规则发送、接收数据。A、B 之间达成的这个相互遵守的规则即为协议。 这种仅在 A、B 之间被遵守的协议称之为原始协议。当此协议被更多的人采用,不断的增加、改进、维护、完 善。最终形成一个稳定的、完整的文件传输协议,被广泛应用于各种文件传输过程中。该协议就成为一个标准协议。 最早的 ftp 协议就是由此衍生而来。 TCP 协议注重数据的传输。http 协议着重于数据的解释。 典型协议 传输层 常见协议有 TCP/UDP 协议。 应用层 常见的协议有 HTTP 协议,FTP 协议。 网络层 常见协议有 IP 协议、ICMP 协议、IGMP 协议。 网络接口层 常见协议有 ARP 协议、RARP 协议。 TCP 传输控制协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 UDP 用户数据报协议(User Datagram Protocol)是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的 简单不可靠信息传送服务。 HTTP 超文本传输协议(Hyper Text Transfer Protocol)是互联网上应用最为广泛的一种网络协议。 FTP 文件传输协议(File Transfer Protocol) IP 协议是因特网互联协议(Internet Protocol) ICMP 协议是 Internet 控制报文协议(Internet Control Message Protocol)它是 TCP/IP 协议族的一个子协议,用于 在 IP 主机、路由器之间传递控制消息。 IGMP 协议是 Internet 组管理协议(Internet Group Management Protocol),是因特网协议家族中的一个组播协 议。该协议运行在主机和组播路由器之间。 ARP 协议是正向地址解析协议(Address Resolution Protocol),通过已知的 IP,寻找对应主机的 MAC 地址。 RARP 是反向地址转换协议,通过 MAC 地址确定 IP 地址。
网络应用程序设计模式 C/S 模式 传统的网络应用设计模式,客户机(client)/服务器(server)模式。需要在通讯两端各自部署客户机和服务器来完 成数据通信。 B/S 模式 浏览器()/服务器(server)模式。只需在一端部署服务器,而另外一端使用每台 PC 都默认配置的浏览器即可完成 数据的传输。 优缺点 对于 C/S 模式来说,其优点明显。客户端位于目标主机上可以保证性能,将数据缓存至客户端本地,从而提高 数据传输效率。且,一般来说客户端和服务器程序由一个开发团队创作,所以他们之间所采用的协议相对灵活。可 以在标准协议的基础上根据需求裁剪及定制。例如,腾讯公司所采用的通信协议,即为 ftp 协议的修改剪裁版。 因此,传统的网络应用程序及较大型的网络应用程序都首选 C/S 模式进行开发。如,知名的网络游戏魔兽世界。 3D 画面,数据量庞大,使用 C/S 模式可以提前在本地进行大量数据的缓存处理,从而提高观感。 C/S 模式的缺点也较突出。由于客户端和服务器都需要有一个开发团队来完成开发。工作量将成倍提升,开发 周期较长。另外,从用户角度出发,需要将客户端安插至用户主机上,对用户主机的安全性构成威胁。这也是很多 用户不愿使用 C/S 模式应用程序的重要原因。 B/S 模式相比 C/S 模式而言,由于它没有独立的客户端,使用标准浏览器作为客户端,其工作开发量较小。只 需开发服务器端即可。另外由于其采用浏览器显示数据,因此移植性非常好,不受平台限制。如早期的偷菜游戏, 在各个平台上都可以完美运行。 B/S 模式的缺点也较明显。由于使用第三方浏览器,因此网络应用支持受限。另外,没有客户端放到对方主机 上,缓存数据不尽如人意,从而传输数据量受到限制。应用的观感大打折扣。第三,必须与浏览器一样,采用标准 http 协议进行通信,协议选择不灵活。 因此在开发过程中,模式的选择由上述各自的特点决定。根据实际需求选择应用程序设计模式。
分层模型 OSI 七层模型 OSI 模型 1. 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主 要作用是传输比特流(就是由 1、0 转化为电流强弱来进行传输,到达目的地后再转化为 1、0,也就是我们常 说的数模转换与模数转换)。这一层的数据叫做比特。 2. 数据链路层:定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问。这一层通常 还提供错误检测和纠正,以确保数据的可靠传输。如:串口通信中使用到的 115200、8、N、1 3. 网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet 的发展使得从世界各 站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。 4. 传输层:定义了一些传输数据的协议和端口号(WWW 端口 80 等),如:TCP(传输控制协议,传输效率低,可 靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与 TCP 特性恰恰相反,用于传输 可靠性要求不高,数据量小的数据,如 QQ 聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据 进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。 5. 会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接 受会话请求(设备之间需要互相认识可以是 IP 也可以是 MAC 或者是主机名)。 6. 表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC 程序与另一台计算 机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII) 来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。 7. 应用层:是最靠近用户的 OSI 层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络 服务。 TCP/IP 四层模型 TCP/IP 网络协议栈分为应用层(Application)、传输层(Transport)、网络层(Network)和链路层(Link)四层。 如下图所示:
一般在应用开发过程中,讨论最多的是 TCP/IP 模型。 TCP/IP 模型 通信过程 两台计算机通过 TCP/IP 协议通讯的过程如下所示: 上图对应两台计算机在同一网段中的情况,如果两台计算机在不同的网段中,那么数据从一台计算机到另一台 计算机传输过程中要经过一个或多个路由器,如下图所示: TCP/IP 通信过程
跨路由通信 链路层有以太网、令牌环网等标准,链路层负责网卡设备的驱动、帧同步(即从网线上检测到什么信号算作新 帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。交换机是工作在链路层的网络设备, 可以在不同的链路层网络之间转发数据帧(比如十兆以太网和百兆以太网之间、以太网和令牌环网之间),由于不 同链路层的帧格式不同,交换机要将进来的数据包拆掉链路层首部重新封装之后再转发。 网络层的 IP 协议是构成 Internet 的基础。Internet 上的主机通过 IP 地址来标识,Inter-net 上有大量路由器负责 根据 IP 地址选择合适的路径转发数据包,数据包从 Internet 上的源主机到目的主机往往要经过十多个路由器。路由 器是工作在第三层的网络设备,同时兼有交换机的功能,可以在不同的链路层接口之间转发数据包,因此路由器需 要将进来的数据包拆掉网络层和链路层两层首部并重新封装。IP 协议不保证传输的可靠性,数据包在传输过程中可 能丢失,可靠性可以在上层协议或应用程序中提供支持。 网络层负责点到点(ptop,point-to-point)的传输(这里的“点”指主机或路由器),而传输层负责端到端(etoe, end-to-end)的传输(这里的“端”指源主机和目的主机)。传输层可选择 TCP 或 UDP 协议。 TCP 是一种面向连接的、可靠的协议,有点像打电话,双方拿起电话互通身份之后就建立了连接,然后说话就 行了,这边说的话那边保证听得到,并且是按说话的顺序听到的,说完话挂机断开连接。也就是说 TCP 传输的双方 需要首先建立连接,之后由 TCP 协议保证数据收发的可靠性,丢失的数据包自动重发,上层应用程序收到的总是可 靠的数据流,通讯之后关闭连接。 UDP 是无连接的传输协议,不保证可靠性,有点像寄信,信写好放到邮筒里,既不能保证信件在邮递过程中不 会丢失,也不能保证信件寄送顺序。使用 UDP 协议的应用程序需要自己完成丢包重发、消息排序等工作。 目的主机收到数据包后,如何经过各层协议栈最后到达应用程序呢?其过程如下图所示:
以太网驱动程序首先根据以太网首部中的“上层协议”字段确定该数据帧的有效载荷(payload,指除去协议首 部之外实际传输的数据)是 IP、ARP 还是 RARP 协议的数据报,然后交给相应的协议处理。假如是 IP 数据报,IP 协 议再根据 IP 首部中的“上层协议”字段确定该数据报的有效载荷是 TCP、UDP、ICMP 还是 IGMP,然后交给相应的 协议处理。假如是 TCP 段或 UDP 段,TCP 或 UDP 协议再根据 TCP 首部或 UDP 首部的“端口号”字段确定应该将应 用层数据交给哪个用户进程。IP 地址是标识网络中不同主机的地址,而端口号就是同一台主机上标识不同进程的地 址,IP 地址和端口号合起来标识网络中唯一的进程。 虽然 IP、ARP 和 RARP 数据报都需要以太网驱动程序来封装成帧,但是从功能上划分,ARP 和 RARP 属于链路层, IP 属于网络层。虽然 ICMP、IGMP、TCP、UDP 的数据都需要 IP 协议来封装成数据报,但是从功能上划分,ICMP、 IGMP 与 IP 同属于网络层,TCP 和 UDP 属于传输层。 协议格式 数据包封装 传输层及其以下的机制由内核提供,应用层由用户进程提供(后面将介绍如何使用 socket API 编写应用程序), 应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节,将数据从一台计算机通过一定的路径发 送到另一台计算机。应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装 (Encapsulation),如下图所示:
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链 路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用 层数据交给应用程序处理。 TCP/TP 数据包封装 以太网帧格式 以太网的帧格式如下所示: 以太网帧格式 其中的源地址和目的地址是指网卡的硬件地址(也叫 MAC 地址),长度是 48 位,是在网卡出厂时固化的。可 在 shell 中使用 ifconfig 命令查看,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。协议字段有三种值,分别对应 IP、 ARP、RARP。帧尾是 CRC 校验码。 以太网帧中的数据长度规定最小 46 字节,最大 1500 字节,ARP 和 RARP 数据包的长度不够 46 字节,要在后面 补填充位。最大值 1500 称为以太网的最大传输单元(MTU),不同的网络类型有不同的 MTU,如果一个数据包从 以太网路由到拨号链路上,数据包长度大于拨号链路的 MTU,则需要对数据包进行分片(fragmentation)。ifconfig 命令输出中也有“MTU:1500”。注意,MTU 这个概念指数据帧中有效载荷的最大长度,不包括帧头长度。
ARP 数据报格式 在网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目的主机的硬件地址,而数据包 首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯 前必须获得目的主机的硬件地址。ARP 协议就起到这个作用。源主机发出 ARP 请求,询问“IP 地址是 192.168.0.1 的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播), 目的主机接收到广播的 ARP 请求,发现其中的 IP 地址与本机相符,则发送一个 ARP 应答数据包给源主机,将自己 的硬件地址填写在应答包中。 每台主机都维护一个 ARP 缓存表,可以用 arp -a 命令查看。缓存表中的表项有过期时间(一般为 20 分钟),如 果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址。想一想, 为什么表项要有过期时间而不是一直有效? ARP 数据报的格式如下所示: ARP 数据报格式 源 MAC 地址、目的 MAC 地址在以太网首部和 ARP 请求中各出现一次,对于链路层为以太网的情况是多余的, 但如果链路层是其它类型的网络则有可能是必要的。硬件类型指链路层网络类型,1 为以太网,协议类型指要转换 的地址类型,0x0800 为 IP 地址,后面两个地址长度对于以太网地址和 IP 地址分别为 6 和 4(字节),op 字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答。 看一个具体的例子。 请求帧如下(为了清晰在每行的前面加了字节计数,每行 16 个字节): 以太网首部(14 字节) 0000: ff ff ff ff ff ff 00 05 5d 61 58 a8 08 06 ARP 帧(28 字节) 0000: 00 01 0010: 08 00 06 04 00 01 00 05 5d 61 58 a8 c0 a8 00 37 0020: 00 00 00 00 00 00 c0 a8 00 02 填充位(18 字节) 0020: 00 77 31 d2 50 10 0030: fd 78 41 d3 00 00 00 00 00 00 00 00 以太网首部:目的主机采用广播地址,源主机的 MAC 地址是 00:05:5d:61:58:a8,上层协议类型 0x0806 表示 ARP。 ARP 帧:硬件类型 0x0001 表示以太网,协议类型 0x0800 表示 IP 协议,硬件地址(MAC 地址)长度为 6,协议 地址(IP 地址)长度为 4,op 为 0x0001 表示请求目的主机的 MAC 地址,源主机 MAC 地址为 00:05:5d:61:58:a8,源 主机 IP 地址为 c0 a8 00 37(192.168.0.55),目的主机 MAC 地址全 0 待填写,目的主机 IP 地址为 c0 a8 00 02(192.168.0.2)。 由于以太网规定最小数据长度为 46 字节,ARP 帧长度只有 28 字节,因此有 18 字节填充位,填充位的内容没 有定义,与具体实现相关。 应答帧如下: 以太网首部 0000: 00 05 5d 61 58 a8 00 05 5d a1 b8 40 08 06
分享到:
收藏