1.1 网络常识,端口)就可以标识网络的进程了

2019-10-05 16:42 来源:未知

一、网络协议

国际标准化组织(ISO)定义了网络协议的基本框架,被称为OSI模型。OSI模型包括应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。而OSI模型过于复杂至今没有得到实际的应用。

TCP/IP协议模型将OSI的7层协议模型简化为4层,从而更有利于实现和使用。TCP/IP协议模型包括应用层、传输层、网络层、网络接口层。

TCP/IP协议与OSI模型的对应关系如下图:

永利平台娱乐 1

 

1.1 网络常识

永利平台娱乐 2进取

参考自《VC++深入详解》

 

1)网络的7层网络协议

首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!

  这是我在看书时记录下来的东西。

 

ISO按照逻辑划分出来7层网络协议

在本地可以通过进程PID来唯一标识一个进程

 注:下面的Socket其实都应该是socket

 

应用层:和应用程序打交道的,进行数据的交互

在网络中网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序,这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。

 

二、套接字socket

它是一种可以进行网络通信的内核对象,它有一个唯一的标识符,一般称它为socket描述符,跟文件描述符类似,也可以用read/wrote/close操作。

        int socket(int domain, int type, int protocol);/*    
        功能:创建socket对象
        domain:通信地址类型
            AF_UNIX    / AF_LOCAL :本地进程间通信
            AF_INET    :使用ipv4地址通信    
            AF_INET6:使用ipv6地址通信
        type:
            SOCK_STREAM :数据流协议,TCP面向连接的通信协议
                优点:安全可靠,数据不丢失,但速度慢。
                一般常用于安全性较高的场景
            SOCK_DGRAM    :数据报协议,UDP面向无连接的通信协议
                优点:速度快,数据可能会丢失,安全性和可靠性于TCP相比不高
                一般用于安全性要求不高,但对速度有要求的场景。
        protocol:特殊协议一般不使用,直接写 0*/

准备通信地址:
基本通信地址
struct sockaddr
{
  sa_family_t sa_family;
  char sa_data[14];
}

本地通信地址
struct sockaddr_un
{
  // 通信地址类型
  sun_family_t sun_family;
  // socket文件的路径
  char sun_path[100];
}
网络通信地址
struct sockaddr_in
{
  //通信地址类型
  short int sin_family;
  //端口号
  in_port_t sin_port;
  //ip地址
  struct in_addr sin_addr;
}

准备好的通信地址通常要将其强制转换成基本通信地址才能传给函数使用。

    int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
    //功能:把socket对象与通信地址建立联系


    int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
    //功能:连接通信目标
    //socketaddr:目标地址

表示层:将应用程序中的数据按照规则封装起来。

使用TCP/IP协议的应用程序通常采用应用编程接口:套接字来实现网络进程之间的通信,所有的应用程序都是采用socket

第14章网络编程

三、网络通信的数据存储方式

个人计算机系统数据的存储方式可能是大端,也可能是小端,网络通信时需要的是大端数据,必须把数据转换成大端。

        uint32_t htonl(uint32_t hostlong);
        //功能:把32位的主机字节序转换成32位的网络字节序

           uint16_t htons(uint16_t hostshort);
        //功能:把16位的主机字节序转换成16位的网络字节序

           uint32_t ntohl(uint32_t netlong);
        //功能:把32为网络字节序转换成32位的主机字节序

           uint16_t ntohs(uint16_t netshort);
        //功能:把16为网络字节序转换成16位的主机字节序

生成端口号
  端口号就是一个16为的无符号整数

uint16_t htons(uint16_t hostshort);

生成ip地址

        in_addr_t inet_addr(const char *cp);
        //功能:把点分十进制的字符串ip地址转换成32位的无符号整数

        char *inet_ntoa(struct in_addr in);
        //功能:把32位的网络字节序的ip地址转换成点分十进制的字符串ip地址

会话层:聊天,对话的意思,控制会话的开始和结束等

1.英文原义是“孔”或“插座”通常也称作"套接字",用于描述IP地址和端口,可以用来实现不同虚拟机或不同计算机之间的通信

 

四、网络通信(UDP)

进程A:创建socket对象->准备地址->绑定->接收数据和来时的地址->原路返回数据->关闭socket
进程B:创建socket对象->准备地址->向目标发送数据->接收数据->关闭socket

当socket对象被全部关闭后,会在内核中停留一段时间(给一个重新连接的机会),如果再使用同样的ip地址和端口号时就会失败(延时关闭)

    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
    //功能:接收数据并获取发送端的地址
    //addrlen:是参数,要得到的src_addr的长度

    ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);    
    //功能:发送数据到指定的目标

传输层:用于数据交换的通道

2.Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务

Socket是连接应用程序与网络驱动程序的桥梁,Socket在应用程序中创建,通过绑定与驱动程序建立关系。

五、网络通信(TCP)

面向连接的网络通信,在通信过程中时刻保持连接,这种通信方式类似与打电话,能保证安全可靠、数据不丢失,但与UDP相比传输速度略低。

进程A:创建socket->准备地址->绑定->监听(设置队列长度)->等待连接->通信->关闭。
进程B;创建socket->准备地址->连接->通信->关闭

    int listen(int sockfd, int backlog);
    //功能:设置socket对象最大的排队数量

    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);     
    //功能:等待其他主机与当前socket建立连接关系。    
    //返回值:建立连接的描述符,此后通信都用此描述符    

    int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
    //功能:连接通信目标
    //socketaddr:目标地址

    ssize_t recv(int sockfd, void *buf, size_t len, int flags);
    //功能:网络通信专用的数据接收    
    //flag: 0  阻塞
    //      1  不阻塞
    //返回值:-1 时,说明连接断开,此时应该结束循环

    ssize_t send(int sockfd, const void *buf, size_t len, int flags);
    //功能:网络通信专用的数据发送
    //返回值:-1 时,说明连接断开    ,此时应该结束循环

 

网络层:通过具体的网络传送数据

3、socket的基本操作是“open—write/read—close”模式,socket提供了这些操作对应的函数接口。

此后,应用程序给Socket的数据,由Socket交给驱动程序向网络上发送出去。

数据链路层:对具体的信息进行编码转换等等。

下面以TCP为例,介绍几个基本的socket接口函数

计算机从网络上收到与该Socket绑定的IP地址和端口号相关的数据后,由驱动程序交给Socket,应用程序便可从该Socket中提取接收到的数据。

物理层:路由器和交换机等

用于创建一个socket描述符,它唯一标识一个socket,后续的操作都有用到它

 

2)常见的协议

指定不同的参数创建不同的socket描述符,socket函数的三个参数分别为:

14.1 计算机网络基本知识。

TCP 传输控制协议,面向连接的协议

常用的协议族有,AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。

1,最简单的网络形式是由两台计算机组成,就酱

UDP 用户数据报协议 ,面向无连接的协议

协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址与端口号的组合、AF_UNIX决定了要用一个绝对路径名作为地址。

永利平台娱乐 3

IP  网络协议 ,信息传递机制

常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等

2,网络上主机间通信需要知道另一主机的名字。在Internet上用一个称为IP地址(4个字节)的整数来标识网络设备。

3)IP地址

常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议(这个协议我将会单独开篇讨论!)。

在Internet上,两台主机要通信,双方必须遵守约定的规则,称为协议。

IP地址是Internet中唯一的地址标识,一般都是一个32位的整数(IPV4),也有128位整数(ipv6)

并不是上面的type和protocol可以随意组合的

计算机中运行着很多网络通信程序(迅雷、酷狗、浏览器等),要怎么区分呢?端口号:标识在计算机上运行的每一个网络通信程序。所以,指定IP外,还要指定端口号。

将ip地址中的每一个字节转换为十进制,采用.隔开,这种IP地址的表示方法叫做:点分十进制表示法

如SOCK_STREAM不可以跟IPPROTO_UDP组合。当protocol为0时,会自动选择type类型对应的默认协议。

IP地址相当于总机号码,而端口号相当于分机号码。

IP地址分为网络号和主机号,将ip地址分为以下四类地址:

当我们调用socket创建一个socket时,返回的socket描述字它存在于协议族中,但没有一个具体的地址。如果想要给它赋值一个地址,就必须调用bind()函数

 

A类:0 + 7位网络地址 + 24位本地地址

bind()函数正如上面所说bind()函数把一个地址族中的特定地址赋给socket,也就是给描述字绑定一个名字

14.1.1 IP地址

B类:10 +14位网络地址 +16位本地地址

例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。

IP网络中每台主机必须有唯一的IP地址

C类:110+21为网络地址 +8位本地地址

函数的三个参数分别为:

IP地址是一个逻辑地址

D类:1110+28位多播地址

sockfd:即socket描述字,它是通过socket()函数创建了,唯一标识一个socket

因特网上的IP地址具有全球唯一性

子网掩码是采用点分十进制表示法进行表示,主要用于指名一个IP地址中哪些位表示网络地址,以及哪些位表示主机地址,不能单独使用,必须和IP地址搭配使用。

addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同,

32位,4字节。常用点分十进制表示,例如:192.168.0.1(每个字节用十进制整数来表示) 

如:IP地址:192.168.182.48

如ipv4对应的是:

注:127.0.0.1 称为是回送地址,指本地机,一般用来测试使用

子网掩码:255.255.255.0  &

struct sockaddr_in {

 


sa_family_t sin_family; /* address family: AF_INET */

14.1.2 协议  P533

192.168.182网络地址

in_port_t sin_port; /* port in network byte order */

为进行网络中的数据交换而建立的规则,标准或约定

其中48表示主机号

struct in_addr sin_addr; /* internet address */

不同层具有各自不同的协议。

可以判断两个不同的IP地址是否在同一个子网中

};

 

MAC地址:电脑上的网卡地址,物理地址

/* Internet address. */

14.1.5 ISO/OSI 七层参考模型

MAC地址也就是物理地址,也就是网卡的地址,可以通过绑定Mac地址来限制上网的设备

struct in_addr {

1,ISO国际标准化组织提出来OSI七层参考模型,将网络的不同功能划分为7层。如下图

4)端口号

uint32_t s_addr; /* address in network byte order */

永利平台娱乐 4

IP地址可以定位具体的主机,端口号可以用于定位具体的某个进程

};

从低到高各层的功能分别如下所述:

端口号是unsigned short类型,范围是 : 0 - 65535,其中0 - 1024的端口号一般被系统占用,比如:HTTP:80 FTP:21

ipv6对应的是:

(1) 物理层:提供二进制传输,确定在通信信道上如何传输比特流

如:

struct sockaddr_in6 {

(2) 数据链路层:提供介质访问,加强物理层的传输功能,建立一条无差错的传输线路

0x12345678

sa_family_t sin6_family; /* AF_INET6 */

(3) 网络层:提供IP寻址和路由。因为在网络上数据可以经由多条线路到达目的地,网络层负责找出最佳的传输线路

=> 按照内存地址从低到高依次存放:

in_port_t sin6_port; /* port number */

(4) 传输层:为源主机到目的端主机提供可靠的数据传输服务,隔离网络的上下层协议,使得网络应用与下层协议无关

0x12    0x34   0x56   0x78

uint32_t sin6_flowinfo; /* IPv6 flow information */

(5) 会话层:在两个相互通信的应用程序之间建立、组织和协调其相互之间的通信

低位内存地址存放高位数据:大端系统

struct in6_addr sin6_addr; /* IPv6 address */

(6) 表示层:处理被传送数据的表示问题,即信息的语法和语义。如有必要,可使用一种通用的数据表示格式,在多种数据表示之间进行切换。

低位内存地址存放低位数据:小端系统

uint32_t sin6_scope_id; /* Scope ID (new in 2.4) */

(7) 应用层:为用户的网络应用程序提供网络通信的服务

字节序只要有两种:网络字节序 和 主机字节序

};

应注意一下几点:

主机字节序一般表示当前主机的字节顺序

struct in6_addr {

(1) OSI七层参考模型并不是物理实体存在这七层,这只是一个功能的划分,是一个抽象的网络参考模型

网络字节序一般表示不同主机之间的统一字节序

unsigned char s6_addr[16]; /* IPv6 address */

(2) 在进行一个网络通信时,每一层为本次通信提供本层的服务。通信实体的对等层之间不允许直接通信

2.0

};

(3) 各层之间是严格单向依赖

使用socket进行通信,soket -套接字,实际上就是一个逻辑通信载体

Unix域对应的是:

(4) 上层使用下层提供的服务 – Service user

2.1一对一通信的模型

struct sockaddr_un {

(5) 下层向上层提供服务 – Service provider

服务器端:

sa_family_t sun_family; /* AF_UNIX */

 

1)创建socket,使用socket函数

char sun_path[UNIX_PATH_MAX]; /* pathname */

2,通信时数据传输的过程:在两个通信实体进行通信时,应用层所发出的数据经过表示层、会话层、传输层、网络层、数据链路层、最终到达物理层,在该层通过物理线路传输给另外一个实体的物理层。

2)准备一个通信地址,使用结构体类型

};

然后,数据再依次向上传递,传递给另一个实体的应用层。

3)将socket和通信地址进行绑定,使用bind函数

addrlen:对应的是地址的长度。

永利平台娱乐, 

4)进行通信,使用read/write函数

通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器;

3,对等层通信的实质就是: 对等层实体之间虚拟通信。下层向上层提供服务,实际通信在最底层完成。

5)关闭socket,使用close函数

而客户端就不用指定,有系统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。

干货:对等通信peer-to-peer communication,为了使数据分组从源传送到目的地,源端OSI模型的每一层都必须与目的端的对等层进行通信,这种通信方式称为对等层通信。
在这一过程中,每一层的协议在对等层之间交换信息,该信息成为协议数据单元(PDU)。
简单来理解就是这样,假设主机A要和主机B通信。A的应用层只能与B的应用层交换信息,而不能与B的其他层(比如传输层)交换信息。 

客户端:

服务器在调用socket之后就会调用listen()来监听这个socket,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。

 

1)创建socket,使用socket函数

socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求

4,OSI7层参考模型中的应用层、传输层和网络层所用的协议:

2)准备一个通信地址,使用结构体类型

listen函数的第一个参数即为要监听的socket描述字,

(1) 应用层:远程登录协议Telnet,文件传输协议FTP(下载文件),超文本传输协议HTTP(浏览网页),

3)将socket和通信地址进行连接,使用connect函数

第二个参数为相应socket可以排队的最大连接个数。

域名服务DNS(网址就是域名),简单邮件传输协议SMTP(发送邮件),邮局协议POP3(收取邮件)。

4)进行通信,使用read/write函数

connect函数的第一个参数即为客户端的socket描述字,

(2) 传输层:传输控制协议TCP:面向连接的可靠的传输协议,通信时要通过三步握手以建立通信双方的连接。

5)关闭socket,使用close函数

第二参数为服务器的socket地址,

用户数据报协议UDP:无连接、不可靠的传输协议。不需要建立连接,可能会丢失数据,实时性较高。

2.2 相关函数的介绍1)socket函数

第三个参数为socket地址的长度。

(3) 网络层:网络协议IP、Internet互联网控制报文协议ICMP,Internet组管理协议IGMP。

int socket(int domain,int type,int protocol)

客户端 依次调用socket()、connect()之后就向 服务器 发送了一个连接请求

 

第一个参数:域/协议簇 AF_UNIX AF_LOCAL ----本地通信

服务器监听到这个请求之后,就会调用accept()函数取接收请求,这样连接就建立好了

14.1.6 数据封装

AF_INET --使用IPV4进行通信

之后就可以开始网络I/O操作了,即类同于普通文件的读写I/O操作。

1,往另外一台计算机发送数据,首先要将该数据打包打包的过程称为封装。

AF_INET6 --使用IPV6进行通信

accept()函数 服务器端 依次调用socket、listen()之后,就会监听指定的socket地址了

2,封装就是在数据前面加上特定的协议头部,例如:用TCP协议传时,数据到传输层时,就会加上TCP协议头,在到达网络层时,在其前面加上IP协议头。

第二个参数:指定协议

第一个参数为服务器的socket描述字,

永利平台娱乐 5

SOCK_STREAM --使用数据流的形式通信,TCP协议

第二个参数为指向struct sockaddr *的指针,用于返回客户端的协议地址,

3,OSI参考模型中,对等协议之间交换的信息单元统称为协议数据单元(PDU)。

SOCK_DGRAM --使用数据报的形式通信,UDP协议

第三个参数为协议地址的长度。

4,为了提供服务,下层把上层的PDU作为本层的数据封装,然后加入本层的头部(有点还要加尾部,如数据链路层)。头部的数据中含有数据传输所需的控制信息。

第三个参数:指定特殊的协议,直接给0

如果accpet成功,那么其返回值是由内核自动生成的一个全新的描述字,代表与返回客户的TCP连接。

 

TAG标签:
版权声明:本文由永利平台娱乐发布于永利平台娱乐,转载请注明出处:1.1 网络常识,端口)就可以标识网络的进程了