您的位置:首页 > 理论基础 > 计算机网络

TCP/IP(6)——网络协议设计入门

2019-05-05 22:46 357 查看

目录

 

 

 

网络程序设计需要考虑的一些问题

并发的网络编程

共享资源问题

函数可重入问题

系统资源的释放和回收

异构环境下的网络编程

字节顺序不一样

字的长度不同

字节定界不一样

阻塞和非阻塞通信

服务类型的选择

差错处理

网络程序工作模型以及套接字

套接口的概念

 

 

网络程序设计需要考虑的一些问题

这里的网络编程是C下的Winsock编程,在网络编程的时候我们需要考虑到以下几点。

  1. 并发的网络编程
  2. 异构环境(不同操作系统)的问题
  3. 阻塞与非阻塞的通讯
  4. 服务类型的选择
  5. 差错处理

并发的网络编程

共享资源问题

多进程的并发执行通常要涉及到共享资源的访问问题,总所周知,我们一般用加锁来实现资源的互斥访问。即访问共享资源时先上锁,完毕之后解锁。

函数可重入问题

可重入:函数可以被中断,并且返回控制的时候不会出现错误。一般我们通过加锁保护实现可重入。

不可重入的函数一般有以下特点:使用了全局变量,使用了malloc、free

系统资源的释放和回收

申请资源(如socket)使用完毕之后我们一定要释放资源,否则容易造成内存泄漏。

异构环境下的网络编程

字节顺序不一样

字节顺序有两种:

  1. 小序在前(低位的字节在内存的低地址)——windows
  2. 大序在前(高位字节在内存的低地址)——Sun OS

举个栗子: 数据0x12345678在存储的时候是分成 0x12 0x34 0x56 0x78 四个bytes在内存中存储的

数据0x12345678中的0x12便是高位,0x78是低位字节。

那么如果是小序在前则低位字节78就是在低地址,我们假设该数据放在内存的首字节,即0-31空间的内存地址

那么0-7的内存(低位)存放的就应该是0x78,24-31的内存存放的就是0x12

如图:

可是网络字节序,是以,收到的第一个字节被当作高位看待,这就要求不管哪一个系统,发送的第一个字节应该是高位的。

在编程的时候,发送的第一个字节是该数字在内存中起始地址对应的字节,可见多字节的数值在发送的时候,应该要大序在前存放。所以,在windows编程中,发送数据我们需要用函数将高低位进行转换。

微软提供的接口中,htonl函数可以将小序在前改为大序在前,ntohl将大序在前改为小序在前。

字的长度不同

64位的操作系统和32位的操作系统中对long int的长度是不一样的,32位long为4bytes,64位编译器long为8个字节。

字节定界不一样

不同从操作系统struct或者union的打包方式不一样,如果以四字节为定价

那么Sizeof(struct{char a;int b})=8;如果一个字节定界,那么=5;

为什么呢?因为char虽然一个字节,但是以四个字节定界,char需要在打包的时候填充以满足四个字节,int 就是四个字节。

而一个字节定界,char占一个字节,int占四个字节,=5个字节。

阻塞和非阻塞通信

阻塞是指调用之后只有在得到结果才会返回。继续执行

非阻塞指的是不能立即得到结果之前,该函数不会阻塞当前的现场,而是会立即返回。

比如,我们调用了send()之后,阻塞模式就会将数据拷贝到缓冲区完毕之后再返回,如果没有空间,则会等到有可用空间后拷贝然后完毕返回,而非阻塞就会直接返回,并且反馈状态。调用recv()之后,阻塞的就要等到有数据可以读取才会返回,而非阻塞就直接返回,并且反馈状态。

因为我们在TCP中有流量控制,有回复确认报文,所以我们需要缓存,而UDP没有发送缓存,所以UDP即使在阻塞模式下也不会发生阻塞。

我们在win32编程的时候,一般函数入口参数有MSG_DONWAIT设置为0的时候便是阻塞状态。

服务类型的选择

面向连接不适合广播多播;面向无连接适合广播多播,适合于少量数据,且对传输质量要求不高的场合。

差错处理

应用层应对网络可能存在的差错进行适当处理。

 

 

网络程序工作模型以及套接字

应用程序编程的时候不直接对TCP/IP核心的协议进行操作,而是通过别人提供的网络应用程序编程接口操作。而这个接口硬要说的话,是传输层与应用层之间的接口。

我们在网络中通信的时候,识别是以套接字为单位的,即,不同的主机通信,我们需要五元组来标识这一个连接。

五元组:协议,本地IP地址,本地端口号,远程IP地址,远程端口号 

 冷知识:为什么要交套接字Socket呢?因为Socket的英文是插座的意思,我们都知道,不同的硬件,比如电脑和热水器,他们都是通过插座,可以连接到同一个供电系统的,所以,套接字在网络中就相当于插座,不同的硬件插到这个插座上,可以互联互通。

套接口的概念

win32提供了三种类型的套接口

  1. 流式套接口(SOCK_STREAM):提供可靠的、面向连接的双向数据传输服务——TCP
  2. 数据报套接口(SOCK_DGRAM):提供不可靠的、无连接的双向数据传输服务, 数据以独立包发送。数据传输中可能会丢失或重复——UDP
  3. 原始套接口(SOCK_RAM):允许对底层协议进行直接访问。自己构造报文,是最原始的服务。

一般APP仅在同一类型的套接口间工作。

套接口工作的时候,主机A中的APPA先将data丢入缓存,然后socket将data传送给TCP协议,然后通过网卡NIC传输到主机B的网卡,然后网络管理软件再将信息保存在主机B的socket中,然后APPB才会去socket中读取数据。

下面是具体流程详解:

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: