7.8-UC-第八课:网络通信

================

第八课  网络通信

================

一、基本概念

------------

1. ISO/OSI七层网络协议模型

~~~~~~~~~~~~~~~~~~~~~~~~~~

+------------+--------------+ ---

|   应用层   |  Application |  ^

+------------+--------------+  |

|   表示层   | Presentation | 高层

+------------+--------------+  |

|   会话层   |    Session   |  v

+------------+--------------+ ---

|   传输层   |   Transport  |  ^

+------------+--------------+  |

|   网络层   |    Network   |  |

+------------+--------------+ 低层

| 数据链路层 |   Data Link  |  |

+------------+--------------+  |

|   物理层   |    Physical  |  v

+------------+--------------+ ---

2. TCP/IP协议族

~~~~~~~~~~~~~~~

1) TCP (Transmission Control Protocol, 传输控制协议)

面向连接的服务。

2) UDP (User Datagram Protocol, 用户数据报文协议)

面向无连接的服务。

3) IP (Internet Protocol, 互联网协议)

信息传递机制。

图示:tcpip.bmp

3. TCP/IP协议与ISO/OSI模型的对比

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ISO/OSI       TCP/IP

+------------+------------+

|   应用层   |            |

+------------+            |

|   表示层   |   应用层   | TELNET/FTP/HTTP

+------------+            |

|   会话层   |            |

+------------+------------+

|   传输层   |   传输层   | TCP/UDP

+------------+------------+

|   网络层   |  互联网层  | IP/路由

+------------+------------+

| 数据链路层 |            |

+------------+ 网络接口层 | 驱动/设备

|   物理层   |            |

+------------+------------+

图示:osi.bmp

4. 消息流

~~~~~~~~~

ISO/OSI       TCP/IP                    TCP/IP      ISO/OSI

+------------+------------+  V      ^  +------------+------------+

|   应用层   |            |  |      |  |            |   应用层   |

+------------+            |  |      |  |            +------------+

|   表示层   |   应用层   |  |      |  |   应用层   |   表示层   |

+------------+            |  |      |  |            +------------+

|   会话层   |            |  |      |  |            |   会话层   |

+------------+------------+  |      |  +------------+------------+

|   传输层   |   传输层   |  V      ^  |   传输层   |   传输层   |

+------------+------------+  |      |  +------------+------------+

|   网络层   |  互联网层  |  |      |  |  互联网层  |   网络层   |

+------------+------------+  |      |  +------------+------------+

| 数据链路层 |            |  |      |  |            | 数据链路层 |

+------------+ 网络接口层 |  |      |  | 网络接口层 +------------+

|   物理层   |            |  +      +  |            |   物理层   |

+------------+------------+   \____/   +------------+------------+

5. 消息包

~~~~~~~~~

+-----------------+

| TELNET/FTP/HTTP |

+-----------------+

|     TCP/UDP     |

+-----------------+

|       IP        |

+-----------------+

|     ETHERNET    |

+-----------------+

从上至下,消息包逐层递增,从下至上,消息包逐层递减。

6. IP地址

~~~~~~~~~

1) IP地址是Internet中唯一的地址标识

A. 一个IP地址占32位,正在扩充至128位。

B. 每个Internet包必须带IP地址。

2) 点分十进制表示法

0x01020304 -> 1.2.3.4,高数位在左,低数位在右。

3) IP地址分级

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

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

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

D级:1110 + 28位多播(Muticast)地址

4) 子网掩码

IP地址 & 子网掩码 = 网络地址

IP地址:  192.168.182.48

子网掩码:255.255.255.0

网络地址:192.168.182

本地地址:48

二、套接字(Socket)

------------------

1. 接口

~~~~~~~

PuTTY -> telnet \

LeapFTP ->    ftp -> socket -> TCP/UDP -> IP -> 网卡驱动 -> 网卡硬件

IE ->   http /     ^

|

应用程序 ----------------+

图示:bsd.bmp

2. 异构

~~~~~~~

Java @ UNIX -> socket <----> socket <- C/C++ @ Windows

3. 模式

~~~~~~~

1) 点对点(Peer-to-Peer, P2P):一对一的通信。

2) 客户机/服务器(Client/Server, C/S):一对多的通信。

4. 绑定

~~~~~~~

先要有一个套接字描述符,还要有物理通信载体,

然后将二者绑定在一起。

5. 函数

~~~~~~~

网络通信(通信之间要协议)

1.通信模型

1)创建一个socket

2)准备通信地址

3)绑定

4)通信

5)关闭socket

2socket函数

#include<sys/socket.h>

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

domain:域

用来选择通信使用的协议簇(是TCP还是其他的)

1) 创建套接字

#include <sys/socket.h>

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

domain   - 域/地址族,取值:

AF_UNIX/AF_LOCAL/AF_FILE: 本地通信(进程间通信);

AF_INET: 基于TCP/IPv4(32位IP地址)的网络通信;

AF_INET6: 基于TCP/IPv6(128位IP地址)的网络通信;

AF_PACKET: 基于底层包接口的网络通信(内核通信协议)。

type     - 通信协议,取值:

SOCK_STREAM: 数据流协议(按顺序发送),即TCP协议;

SOCK_DGRAM: 数据报协议(),即UDP协议。

protocol - 特别通信协议,一般不用,置0即可。

成功返回套接字描述符(文件描述符),失败返回-1。

套接字描述符类似于文件描述符,UNIX把网络当文件看待,

发送数据即写文件,接收数据即读文件,一切皆文件。

2) 准备通信地址(un.h)

A. 基本地址类型

struct sockaddr {

sa_family_t sa_family;   // 地址族

char        sa_data[14]; // 地址值

};

B. 本地地址类型

#include <sys/un.h>

struct sockaddr_un {

sa_family_t sun_family; // 地址族

char        sun_path[]; // 套接字文件路径

};

C. 网络地址类型

#include <netinet/in.h>

struct sockaddr_in {

// 地址族

sa_family_t sin_family;

// 端口号

// unsigned short, 0-65535

// 逻辑上表示一个参与通信的进程

// 使用时需要转成网络字节序

// 0-1024端口一般被系统占用

// 如:21-FTP、23-Telnet、80-WWW

in_port_t sin_port;

// IP地址

struct in_addr sin_addr;

};

struct in_addr {

in_addr_t s_addr;

};

typedef uint32_t in_addr_t;

IP地址用于定位主机,端口号用于定位主机上的进程。

3) 将套接字和通信地址绑定在一起

#include <sys/socket.h>

int bind (int sockfd, const struct sockaddr* addr,

socklen_t addrlen);

成功返回0,失败返回-1。

4) 建立连接

#include <sys/socket.h>

int connect (int sockfd, const struct sockaddr* addr,

socklen_t addrlen);

成功返回0,失败返回-1。

5) 用读写文件的方式通信:read/write

6) 关闭套接字:close

7) 字节序转换

#include <arpa/inet.h>

// 32位无符号整数,主机字节序 -> 网络字节序

uint32_t htonl (uint32_t hostlong);

// 16位无符号整数,主机字节序 -> 网络字节序

uint16_t htons (uint16_t hostshort);

// 32位无符号整数,网络字节序 -> 主机字节序

uint32_t ntohl (uint32_t netlong);

// 16位无符号整数,网络字节序 -> 主机字节序

uint16_t ntohs (uint16_t netshort);

主机字节序因处理器架构而异,有的采用小端字节序,

有的采用大端字节序。网络字节序则固定采用大端字节序。

8) IP地址转换

#include <arpa/inet.h>

// 点分十进制字符串 -> 网络字节序32位无符号整数

in_addr_t inet_addr (const char* cp);

// 点分十进制字符串 -> 网络字节序32位无符号整数

int inet_aton (const char* cp, struct in_addr* inp);

// 网络字节序32位无符号整数 -> 点分十进制字符串

char* inet_ntoa (struct in_addr in);

6. 编程

~~~~~~~

1) 本地通信

服务器:创建套接字(AF_LOCAL)->准备地址(sockaddr_un)并绑定->接收数据->关闭套接字

客户机:创建套接字(AF_LOCAL)->准备地址(sockaddr_un)并连接->发送数据->关闭套接字

范例:locsvr.c、loccli.c

2) 网络通信

服务器:创建套接字(AF_INET)->准备地址(sockaddr_in)并绑定->接收数据->关闭套接字

客户机:创建套接字(AF_INET)->准备地址(sockaddr_in)并连接->发送数据->关闭套接字

范例:netsvr.c、netcli.c

三、基于TCP协议的客户机/服务器模型

----------------------------------

1. 基本特征

~~~~~~~~~~~

1) 面向连接。

2) 可靠,保证数据的完整性和有序性。

ABCDEF

A ->         -

B ->         |

C ->         +- 时间窗口

D ->         |

E -> <- A OK -

F -> <- B OK

<- C OK

<- D OK

<- E OK

<- F OK

每个发送都有应答,若在时间窗口内没有收到A的应答,

则从A开始重发。

2. 编程模型

~~~~~~~~~~~

------+-------------------------+-------------------------+------

步骤 |          服务器         |         客户机          | 步骤

------+------------+------------+------------+------------+------

1  | 创建套接字 | socket     |     socket | 创建套接字 |  1

2  | 准备地址   | ...        |        ... |   准备地址 |  2

3  | 绑定套接字 | bind       |            |       ---- |

4  | 监听套接字 | listen     |            |       ---- |

5  | 接受连接   | accept     |    connect |   建立链接 |  3

6  | 接收请求   | recv       |       send |   发送请求 |  4

7  | 发送响应   | send       |       recv |   接收响应 |  5

8  | 关闭套接字 | close      |      close | 关闭套接字 |  6

------+------------+------------+------------+------------+------

图示:handshake.bmp、tcpcs.bmp

3. 常用函数

~~~~~~~~~~~

#include <sys/socket.h>

int listen (int sockfd, int backlog);

将sockfd参数所标识的套接字标记为被动模式,

使之可用于接受连接请求。

backlog参数表示未决连接请求队列的最大长度,

即最多允许同时有多少个未决连接请求存在。

若服务器端的未决连接数已达此限,

则客户机端的connect()函数将返回-1,

且errno为ECONNREFUSED。

成功返回0,失败返回-1。

图示:listen.bmp

int accept (int sockfd, struct sockaddr* addr,

socklen_t* addrlen);

从sockfd参数所标识套接字的未决连接请求队列中,

提取第一个连接请求,同时创建一个新的套接字,

用于在该连接中通信,返回该套接字的描述符。

addr和addrlen参数用于输出连接请求发起者的地址信息。

成功返回通信套接字描述符,失败返回-1。

图示:accept.bmp

ssize_t recv (int sockfd, void* buf, size_t len,

int flags);

通过sockfd参数所标识的套接字,

期望接收len个字节到buf所指向的缓冲区中。

成功返回实际接收到的字节数,失败返回-1。

ssize_t send (int sockfd, const void* buf,

size_t len, int flags);

通过sockfd参数所标识的套接字,

从buf所指向的缓冲区中发送len个字节。

成功返回实际被发送的字节数,失败返回-1。

图示:concurrent.bmp

范例:tcpsvr.c、tcpcli.c

图示:inetd.bmp

四、基于UDP协议的客户机/服务器模型

----------------------------------

1. 基本特征

~~~~~~~~~~~

1) 无连接。

2) 不可靠,不保证数据的完整性和有序性。

A

/ \

/   \

ABC ->+-(B)-+-> CA

\   /

\ /

C

效率高速度快。

2. 编程模型

~~~~~~~~~~~

------+-------------------------+-------------------------+------

步骤 |          服务器         |         客户机          | 步骤

------+------------+------------+------------+------------+------

1  | 创建套接字 | socket     |     socket | 创建套接字 |  1

2  | 准备地址   | ...        |        ... |   准备地址 |  2

3  | 绑定套接字 | bind       |            |       ---- |

4  | 接收请求   | recvfrom   |     sendto |   发送请求 |  3

5  | 发送响应   | sendto     |   recvfrom |   接收响应 |  4

6  | 关闭套接字 | close      |      close | 关闭套接字 |  5

------+------------+------------+------------+------------+------

图示:udpcs.bmp

3. 常用函数

~~~~~~~~~~~

#include <sys/socket.h>

ssize_t recvfrom (int sockfd, void* buf, size_t len,

int flags, struct sockaddr* src_addr,

socklen_t* addrlen);

通过sockfd参数所标识的套接字,

期望接收len个字节到buf所指向的缓冲区中。

若src_addr和addrlen参数不是空指针,

则通过这两个参数输出源地址结构及其长度。

注意在这种情况下,

addrlen参数的目标应被初始化为,

src_addr参数的目标数据结构的大小。

成功返回实际接收到的字节数,失败返回-1。

ssize_t sendto (int sockfd, const void* buf,

size_t len, int flags,

const struct sockaddr* dest_addr,

socklen_t addrlen);

通过sockfd参数所标识的套接字,

从buf所指向的缓冲区中发送len个字节。

发送目的的地址结构及其长度,

通过dest_addr和addrlen参数输入。

成功返回实际被发送的字节数,失败返回-1。

范例:udpsvr.c、udpcli.c

图示:tcp_udp.bmp

127.0.0.1: 回绕地址,表示本机,不依赖网络。

练习:基于TCP协议的网络银行。

代码:bank/

来自为知笔记(Wiz)

原文地址:https://www.cnblogs.com/xuxaut-558/p/10041723.html

时间: 2024-10-19 14:00:16

7.8-UC-第八课:网络通信的相关文章

第八课 网络通信

unix_c_08.txt================第八课 网络通信================一.基本概念------------1. ISO/OSI七层网络协议模型~~~~~~~~~~~~~~~~~~~~~~~~~~+------------+--------------+ ---| 应用层 | Application | ^+------------+--------------+ || 表示层 | Presentation | 高层+------------+---------

NeHe OpenGL教程 第三十八课:资源文件

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十八课:资源文件 从资源文件中载入图像: 如何把图像数据保存到*.exe程序中,使用Windows的资源文件吧,它既简单又实用. 欢迎来到NeHe教程第38课.离上节课的写作已经有些时日了,加上写了一整天的code,也许笔头已经

【C++探索之旅】第一部分第八课:传值引用,文件源头

内容简介 1.第一部分第八课:传值引用,文件源头 2.第一部分第九课预告:数组威武,动静合一 传值引用,文件源头 这一课的标题有点怪.其实是由这一课的几个重点内容结合起来取的名,慢慢学习就知道啦. 上一课<[C++探索之旅]第一部分第七课:函数效应,分而治之>中,我们初步认识了函数. 不过不要高兴得太早,你以为函数就这样离你远去了嘛?怎么可能,函数将伴随一生好吗,只要你继续编程的话.哈哈,所以你是跑不掉了~ [小编,都跟你签了协议了,没吃药不要随便出来溜达] 这一课我们就继续深入学习与函数相关

NeHe OpenGL教程 第二十八课:贝塞尔曲面

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第二十八课:贝塞尔曲面 贝塞尔曲面: 这是一课关于数学运算的,没有别的内容了.来,有信心就看看它吧. 贝塞尔曲面 作者: David Nikdel ( [email protected] ) 这篇教程旨在介绍贝塞尔曲面,希望有比我更

NeHe OpenGL教程 第十八课:二次几何体

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第十八课:二次几何体 二次几何体: 利用二次几何体,你可以很容易的创建球,圆盘,圆柱和圆锥. 二次曲面是一种画复合对象的方法,这种方法通常并不需要很多的三角形.我们将要使用第七课的代码.我们将要增加7个变量以及修改纹理以增加一些变化

【Linux探索之旅】第二部分第八课:RTFM 阅读那该死的手册

内容简介 1.第二部分第八课:RTFM 阅读那该死的手册 2.第二部分第九课预告:查找文件,无所遁形 RTFM 阅读那该死的手册 今天这一课也会很轻松. 一般Windows的用户不太习惯看使用手册.有些Windows下的软件下载后是带有使用手册的,但是谁会花时间看呢? 在Linux下,阅读手册应该成为一个反射动作,一个自然而然的反应.虽说一开始要我们去看手册会有点让人生畏,但是我们学习各种Linux命令的使用方法的最好去处就是手册了. 我们这个系列教程也绝不能和手册相比,因为我们的教程里对于每一

【二毛SEO教程】第八课:SEO操作-标签的优化

课前复习(第七课): 1.   标题确定后,不要再改:关键词可改.描述不要轻易改. 2.   关键词密度:不要刻意堆砌或者靠近参考比例,临门一脚即可. 3.   关键词:选词很重要,不要急着发外链. 第八课正文: 1.  如何给网站图片添加alt属性? 作用:告诉搜索引擎,这个图片是什么内容. 什么情况下要做ALT:图片和网站本身内容有紧密联系或者链接到内页 (1)  告诉搜索引擎,图片内容. (2)  促进搜索引擎爬行图片内页内容,促进收录量提升. 哪些页面要做ALT:首页和分类页 index

【C语言探索之旅】 第一部分第八课:第一个C语言小游戏

? 内容简介 1.课程大纲 2.第一部分第八课:第一个C语言小游戏 3.第一部分第九课预告: 函数 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量类型 文

Kali Linux Web 渗透测试视频教程— 第八课 nessus

Kali Linux Web 渗透测试视频教程— 第八课 nessus 文/玄魂 视频课程地址:http://edu.51cto.com/course/course_id-1887.html 目录 nessus Nessus安装 Nessus初始化 Nessus 应用-基本配置 Nessus 应用-基本概念 Nessus 应用-基本步骤 Nessus 应用-应用 视频课程地址:http://edu.51cto.com/course/course_id-1887.html ps:对此文章感兴趣的读