网络编程概述

今天开始正式学习网络编程这一块,特做此笔记记录学习过程。

要编写通过计算机网络通信的程序,首先要确定这些程序相互通信所用的protocol。在深入设计一个协议的细节之前,应该从高层次决断通信由哪个程序发起以及响应在何时产生,如一般认为web父娶妻程序是一个长时间运行的程序(即所谓的守护进程daemon),它只在响应来自网络的请求才发送网络消息。协议的一段是web客户程序,如浏览器,与服务器进程的通信总是由客户进程发起。大多数网络应用就是按照客户(client)和服务器(server)来组织的。在设计网络应用时,确定总是由客户发起请求往往能够简化协议和程序本身。当然也一些较为复杂的网络应用还需要异步回调(asynchronous callback)通信,也就是由服务器向客户发起请求消息。不过多为采用客户/服务器模型如下图:
这里写图片描述
通常客户每次只与一个服务器通信,不过以使用web浏览器为例,我们也许在10分钟内与许多不同的web服务器通信。从服务器角度来看,一个服务器同时与多个客户通信并不稀罕,如下图:
这里写图片描述
对于TCP/IP协议族而言,web客户和服务器之间使用TCP(Transmission Control Protocol,传输控制协议)通信。TCP又转而使用IP(Internet Protocol,网际协议)通信,IP再通过某种形式的数据链路层通信,如果客户和服务器处于同一以太网,就又如下图所示通信层次。这里写图片描述
尽管客户与服务器之间使用某个应用协议通信,传输层却使用TCP通信,注意,客户与服务器之间的信息流在其中一端是向下通过协议栈的,跨越网络后,在另一端则是向上通过协议栈的。另外注意,客户与服务器通常是用户进程,而TCP和IP协议通常是内核中协议栈的一部分。另外,此图也是OSI模型的一个示例。
OSI模型
描述一个网络中各个协议层的常用方法是使用国际标准化组织(International Organization for Standardization, ISO)的计算机通信开放系统互连(Open systems interconnection, OSI)模型,其有七层。如下图:
这里写图片描述
OSI 模型的顶上三层被合并成一层,称为应用层。这就是Web客户(浏览器),Telnet客户、Web服务器、FTP服务器和其他我们在使用的网络应用所在的层。
套接字提供的是从OSI模型的顶上三层进入传输层的接口:1、顶上三层处理具体的网络应用的所有细节,却对通信细节了解很少;底下四层对具体网络应用了解不多,却处理所有的通信细节:发送数据、等待确认,给无序到达的数据排序、计算并验证校验和等等。2、顶上三层通常构成所谓的用户进程(user process),底下四层却通常作为操作系统内核的一部分提供。Unix与其他现代操作系统都提供分割用户进程和内核的机制。
术语
计算机网络各层对等实体(同一层)间交换的单位信息称为协议数据单元(protocol data unit,PDU),分节(segment)就是对应于TCP传输层的PDU。按照协议与服务之间的关系,除了最低层(物理层)外,每层的PDU通过由紧邻下层提供给本层的服务接口,作为下层的服务数据单元(service data unit,SDU)传递给下层,并由下层间接完成本层的PDU交换。如果本层的PDU大小超过紧邻下层的最大SDU限制,那么本层还要事先把PDU划分成若干合适的片段让下层分开截送,再在相反方向把这些片段重组成PDU。同一层内SDU作为PDU的净荷(payload)字段出现,因此可以说上层PDU由本层PDU(通过其SDU字段)承载。每层的PDU除用于承载紧邻上层的PDU外,也用于承载本层协议内部通信所需的控制信息。
应用层实体(如客户或服务器进程)间交换的PDU称为应用数据(application data),其中在TCP引用进程之间交换的是没有长度限制的单个双向字节流,在UDP应用进程之间交换的是其长度不超过UDP发送缓冲区大小的单个记录(record),在SCTP应用进程之间交换的是没有总长度限制的单个或多个双向记录流。传输层实体(例如对应某个端口的传输层协议代码的一次运行)间交换的PDU称为消息(message),其中TCP的PDU称为分节(segement)。消息或分节的长度是有限的。在TCP传输层中,发送端TCP把来自引用进程的字节流数据(即由应用进程通过一次次输出操作写入到发送端TCP套接字中的数据)按顺序经分割后封装在各个分节中传送给接收端TCP,其中每个分节所封装的数据既可能是发送端应用进程单词输入操作的结果,也可能是连续数次输出操作的结果,而且每个分节所封装的单次输出操作的结果或首尾两次输出操作的结果即可能是完整的,也可能是不完整的,具体取决于可在连续建立阶段由对段通信的最大分节大小(maximum segment size,MSS)以及外出接口的最大传输单元(maximum transmission unit,MTU)或外出路径的路径MTU(如果网络层具有路径MTU发现功能,如IPv6)。分节除了用于承载应用数据外,也用于建立连接(SYN分节)、终止连接(FIN分节)、中止连接(RST分节)、确认数据接收(ACK分节)、刷送带发数据(PSH分节)和携带紧急数据指针(URG分节),而且这些功能(包括承载数据)可以灵活组合。UDP传输层相当简单,发送端UDP把来自应用层进程的单铬记录整个封装在UDP小心中传送给对段UDP。SCTP引入了称为块(chunk)的数据单元,SCTP消息就由一个公共首部加上一个或多个块组成:公共部分类似UDP消息的首部,仅仅给出源目的端口和整个SCTP消息的校验和;块则即可以承载数据(DATA块),也可以承载控制信息(由SACK块、INIT块、COOKIE ECHO块等,总称控制块)。发送段SCTP把来自应用进程的(一个或多个)记录流数据按照流内顺序和记录边界封装在各个DATA块中,并在DATA块首部记上各自的流ID。一个记录通常对应一个DATA块;对于过长的记录,发送端SCTP既可以像UDP那样拒绝发送,也可以把他们拆分到多个DATA块中以便发送,接收端SCTP收取后把他们组合成单个记录商船,作为传输层PDU的SCTP消息既可以只包含单个块(DATA块或控制块)也可以在接口MTU或路径MTU的限制下包含多个块(称为块的捆绑,控制块在前,DATA块在后),不过INIT块、INIT ACK块和SHUTDOWN COMPLETE块不能跟任何其他块捆绑。SCTP接受两端均独立处理捆绑在同一消息中的各个块。
网络层实体间交换的PDU称为IP数据报(IP datagram),其长度有限:IP数据包最大65535字节,IPv6数据报最大65575字节。发送端IP把来自传输层的消息(或TCP分节)整个封装在IP数据报中传送。俩路层实体间交换的PDU称为帧(frame),其长度取决于具体的接口。IP数据报由IP首部和所承载的传输层数据(即网络层的SDU)构成。过长的IP数据报无法封装在单个帧中,需要先对其SDU进行分片(frgmentation),再把分成的各个片段(fragment)冠以新的IP首部封装到单个帧中。再一个IP数据报从源端到目的段的传送过程中,分片操作既可能发生再源端,也可能发生再途中,而其逆操作即重组(reassembly)一般只发生在目的端;SCTP为了传送过长的记录采取类似的分片和重组措施。TCP/IP协议族为提高效率会尽可能避免IP的分片/重组操作;TCP根据MSS和MTU限定每个分节的大小以及SCTP根据MTU分片/重组过长记录都是这个目的(SCTP的块捆绑则是为了避免IP分片/重组操作的前提下提高块传输效率);另外,IPv6禁止在途中分片操作(基于其路径MTU的发现功能),IPv4也尽量避免这种操作。不论是否分片,都由IP作为链路层的SDU传入链路层,并由链路层封装在帧中的数据称为分组(package,包)。可见一个分组即可能是完整的IP数据报,也可能是某个IP数据报的SDU的一个片段冠以新的IP首部后的结果。其中MSS是应用层和传输层(TCP)之间的接口属性,MTU则是链路层和网络层之间的接口属性。

   PS:[ProcessOn](*https://www.processon.com/network*)是个不错的在线画图工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值