Linux——计算机网络

一.历史

  1. 网络产生

二战结束,世界迅速进入了美苏冷战对抗状态。1957年,苏联成功发射了第一颗人造卫星"sputnik",震惊了整个西方世界,极大的刺激了美国。为了防止对美国不利的震惊技术再次出现,1958年,美国总统艾森豪威尔向国会提出在国防部下设一个国防高级研究项目局(Defense Advance Research Project Agency简称DARPA),专门研究未来的军事科技技术。1968年,DARPA提出建立ARPA网络,以便于在各科研机构之间,共享科研资源。早期的ARPA网络使用(Network Control Protocol)NCP协议,不支持不同类型的操作系统、不同类型的计算机之间的通信,不支持纠错功能。

2.TCP协议产生

1972年,Robert Kahn被DARPA的信息处理办公室雇佣,专门研究卫星和地面的网络通信。1973年春,NCP协议的制定者Vinton Cerf也加入了DARPA的信息处理办公室,专门研究封包交换网络。当时DARPA已经开发了ARPA网络、封包无线网和封包卫星网,他们都使用自己的通讯协议交换封包,彼此之间不能互相通讯。为了解决这个问题,Vintin Cerf 和Robert Kahn 开发了TCP协议(Transmission Control Protocol),支持不同封包交换网络之间的通讯。

3.TCP/IP协议产生

1974年,由于实时性数据传输的要求, TCP 协议被分成了TCP和IP(Internet Procotol),TCP协议专门负责检测网络传输中的差错并处理;IP(Internet Procotol)协议专门负责对不同网络进行互联。

什么样的数据有实时性传输要求?

优酷看视频时,如果网络不好,大家是希望看到有少量马赛克的流畅的视频,还是希望看到非常清晰,但非常卡的视频?

为什么TCP协议要分成TCP和IP协议?

TCP协议过于强调可靠性,当出现封包出错时,会要求对方重发,这样会因为处理错误封包,而使得整个网络延迟比较严重,所以为了克服这个缺点,将TCP分成了TCP和IP协议,同时加入了UDP(User Datagram Protocol)协议。这样对于实时性要求比较高,可靠性要求相对较低的通信,采用UDP + IP协议来通信。对于可靠性要求比较高的,采用TCP + IP协议来通信。

4.TCP/IP协议广泛使用

1983年,TCP/IP协议在伯克利大学的BSD(unix)系统中实现,并随着BSD(unix)系统发布,TCP/IP协议得到了广泛的使用。

5.网络协议关系图

通过网络历史,容易得出如下网络协议关系:

二.基本概念

为了能更好的理解网络及网络历史,有必要了明确一下网络基本概念:

  1. 封包

对数据的一种包装,俗称数据包,类似于快递的"包装"。

2.协议

双方约定好的数据包格式,类似于快递公司跟我们约定好, 一定要在xx位置填收货人地址和电话号码。

3.网(Internet)

连接网络的网络。

4.TCP/IP

Internet网络用到的协议,他是一组协议的总称。

5.RFC(Request For Comments)

征求修正意见书

(1)中文版

http://www.cnpaf.net/class/rfcall/

(2)英文版

http://www.ietf.org/rfc.html

三.概述

整个互联网非常复杂,涉及到很多知识,学习互联网不能一蹴而就,所以这里从最简单的家庭网络开始学习:

家庭网络一般是通过Modem拨号上网,然后通过家庭路由器,将网络连接到家里所有的可以联网的设备。家庭网络中,所有设备联网方式完全相同,所以只需要学习一个设备和其他设备之间如何通讯,即可理解家庭网络。这里我们通过telnet和百度两个网络应用,来研究A电脑如何跟其他设备进行通讯:

  1. telnet(远程登录)本地计算机B

搞清楚计算机A如何跟局域网内部设备通讯。

2.百度

搞清楚计算机A如何跟局域网外部的设备通讯。

四.网络参数配置

电脑要联网,必须配置网络参数,windows下的配置界面如下:

从上面的界面可以看出,电脑要联网必须配置或自动获取IP地址、子网掩码、网关和DNS,我们可以通过百度搜索简单了解这些网络参数的功能:

  1. IP地址

是网络中主机的唯一标识,它由网络地址和主机号组成。网络地址是子网的唯一标识,类似于电话号码的区号;主机号是子网内每台主机的编号。在现在(IPv4)的网络中,IP地址是32bit的二进制数,采用大端字节序:

【1】表示方法(点分十进制)

直接使用二进制数,不容易记忆,为了方便记忆,将32位二进制码划分为4个字节,每个字节转化成相应的十进制数,字节之间用"."来分隔,这种表示方法,称之为"点分十进制表示法"。

例:192 .168 .1 .1

11000000 10101000 00000001 00000001

|----|-----------------------|-------------------------|---------------|
| 类型 | 范围 | 用途 ||
| A类 | 0.x.x.x---127.x.x.x.x | 10.x.x.x | 私网(局域网)地址 |
| A类 | 0.x.x.x---127.x.x.x.x | 127.x.x.x | 环回网络地址 |
| A类 | 0.x.x.x---127.x.x.x.x | 其他 | 大型主干网地址 |
| B类 | 128.x.x.x - 191.x.x.x | 172.16.x.x - 172.31.x.x | 私网(局域网)地址 |
| B类 | 128.x.x.x - 191.x.x.x | 169.254.x.x | 表示没有找到DHCP服务器 |
| B类 | 128.x.x.x - 191.x.x.x | 其他 | 主干(城市)网地址 |
| C类 | 192.x.x.x - 223.x.x.x | 192.168.x.x | 私网(局域网)地址 |
| D类 | 组播地址 |||
| E类 | 保留 |||

注意**:主机号为0的IP地址是网络地址,主机号为255的地址是广播地址。**

2.子网掩码

获取IP地址中的网络地址和主机地址:

3.网关

一个网络到另一个网络的关口

4.DNS(域名解析系统)

www.baidu.com(域名,计算机名)转换成百度服务器的IP地址。

五.协议

协议:

OSI标准 (open system )

open system interconnect
【1】OSI 模型 ===》开放系统互联模型 ==》分为7层:

理想模型 ==》尚未实现

tftp

b /etc/passwd

a /etc/123

应用层

表示层 加密解密 gzip

会话层 网络断开,连接状态,keep-close keep-alive

传输层tcp udp 协议 文件 视频,音频 ipx

"12345"

网路层ip NAT

网间层 网际层

链路层 交换机 数据的格式化 帧 校验

物理层 100Mb/8 10Gbits 100MB 同轴电缆

发的信息

网际层

发送 比特流 //

尾|1010 0100|头 ---帧格式

01010010|010

EDID

比特流 (物理层面的 物理信号组成的二进制数据)

01001010

网络分层模型:

osi 模型 --- 理想化模型 --- 并没有真正实现

【2】TCP/IP模型 ==》网际互联模型 ==》分为4层:

实用模型 ===》工业标准

tcp/ip协议栈

应用层 ====》应用程序

传输层 ====》端口号tcp udp

网络层 ====》IP 地址

物理层 ====》网卡 驱动 1GB

pcap ,,,

【3】 TCP/协议

六.网络编程

编程

linux操作系统

用户空间\] 应用层 //程序员实现 ------------------------------------------------------ \[内核空间\] 传输层 \[网络协议栈\] //内核已经实现好的 属于网络功能 网络层 数据链路层 物理层 程序发送数据 系统调用 --- 通过系统调用来使用操作系统提供的网络功能 函数接口 --- socket socket: 1. 操作系统提供的函数接口 //通过这个接口可以使用网络功能 2. 套接字 在使用的思路上,套接字 被抽象成了文件 特殊文件 --- 专门用来进行网络通信 文件 描述符 ![](https://i-blog.csdnimg.cn/direct/84089eaf417d4c13b3a9e4f15ceefe8e.bmp) ## **七.网络编程模型:** 网络编程模型: 1.c/s 模型 client ----- server 2.b/s 模型 Brower / server //浏览器 - 服务器 3.p2p 模型 peer 2 peer //点 对 点 ## 八.cs模型 基于 两种传输协议实现 【1】 tcp 协议 (1)传输层的协议 --- 控制传输过程 tcp 特点: 1.面向链接 2.可靠传输 3.字节流 (2) 应用: 登录网站 ---tcp qq登录 【2】udp 协议 侧重 传输效率 (1)udp 特点: 1.无连接 2.不可靠 3.数据报 (2) 应用: 视频传输 【3】tcp的连接: 三次握手 client -------------- server 1--连接请求--\> 2\<--回应------ 3---确认-----\> client //作为主动的角色 server //被动角色 可靠传输: 无差错 无丢失 --- 每个字节 都编号 无失序 --- 无重复 --- 123456789 10 【4】tcp的编程: 流程 1.建立连接 2.数据通信 //通信模型 cs --- 打电话 //客户端 1.socket //买了个手机 2.bind (可选) // sim 卡 3.connect // 拨打电话 //服务器端 1.socket //买了个手机 2.bind // sim 卡 3.listen // 监听 --待机 4.accept // 接听 #include \ /\* See NOTES \*/ #include \ 【5】int socket(int domain, int type, int protocol); 功能:程序向内核提出创建一个基于内存的套接字描述符 参数:domain 地址族,PF_INET == AF_INET ==\>互联网程序 PF_UNIX == AF_UNIX ==\>单机程序 type 套接字类型: SOCK_STREAM 流式套接字 ===》TCP SOCK_DGRAM 用户数据报套接字===\>UDP SOCK_RAW 原始套接字 ===》IP protocol 协议 ==》0 表示自动适应应用层协议。 返回值:成功 返回申请的套接字id 失败 -1; ![](https://i-blog.csdnimg.cn/direct/cbb32162bc39461985ad3891681ca151.bmp) 【6】int connect(int sockfd, const struct sockaddr \*addr, socklen_t addrlen); 功能:该函数固定有客户端使用,表示从当前主机向目标 主机发起链接请求。 参数:sockfd 本地socket创建的套接子id addr 远程目标主机的地址信息。 addrlen: 参数2的长度。 返回值:成功 0 失败 -1; ![](https://i-blog.csdnimg.cn/direct/2ab55854e8734a8d9461e6c8d5907623.bmp) 【7】网络通信过程 QQ_A QQ_B \[用户空间\] \| \| -------------------socket-----------------------socket-------------- \[内核空间\] \[传输层tcp\] \[传输层tcp

|

网络层\] \[网络层

|

数据链路层\] \[数据链路层

|

物理层\] -----------------\> \[物理层

网络中找到主机 ---- ip

找到主机中进程 ---- 端口号

端口号

作用: 用来标识一个进程

组成:

16位的数据

0~65535

//

1~1023 // 知名端口号

80 http

23

21

1024~50000 //系统注册的

>=50000 //动态的

ip+端口号 ==> 网络中进程的唯一地址

struct sockaddr //地址的类型

struct sockaddr_in {

sa_family_t sin_family; /* address family: AF_INET */

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

struct in_addr sin_addr; /* internet address */

};

/* Internet address. */

struct in_addr {

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

};

network byte order //网络字节序 ---大端

//字节序转换

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong); //主机到网络

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong); //网络到主机

uint16_t ntohs(uint16_t netshort);

//ip地址转换

in_addr_t inet_addr(const char *cp);

"192.168.0.1"

bind

【8】int bind(int sockfd, struct sockaddr *my_addr,

socklen_t addrlen);

功能:如果该函数在服务器端调用,则表示将参数1相关

的文件描述符文件与参数2 指定的接口地址关联,

用于从该接口接受数据。

如果该函数在客户端调用,则表示要将数据从

参数1所在的描述符中取出并从参数2所在的接口

设备上发送出去。

注意:如果是客户端,则该函数可以省略,由默认

接口发送数据。

返回值:

成功 0

失败 -1

【9】 int listen(int sockfd, int backlog);

功能:在参数1所在的套接字id上监听等待链接。

参数:sockfd 套接字id

backlog 允许链接的个数。

返回值:成功 0

失败 -1;

【10】int accept(int sockfd, struct sockaddr *addr,

socklen_t *addrlen);

功能:从已经监听到的队列中取出有效的客户端链接并

接入到当前程序。

参数:sockfd 套接字id

addr 如果该值为NULL ,表示不论客户端是谁都接入。

如果要获取客户端信息,则事先定义变量

并传入变量地址,函数执行完毕将会将客户端

信息存储到该变量中。

addrlen: 参数2的长度,如果参数2为NULL,则该值

也为NULL;

如果参数不是NULL,&len;

一定要写成len = sizeof(struct sockaddr);

返回值:成功 返回一个用于通信的新套接字id;

从该代码之后所有通信都基于该id

失败 -1;

创建客户端,连接服务器,向服务器发送后处理,返回处理后数据,打印

.创建服务器,从客户端接受数据,处理后发送回客户端

相关推荐
宁zz9 小时前
乌班图安装jenkins
运维·jenkins
大丈夫立于天地间10 小时前
ISIS协议中的数据库同步
运维·网络·信息与通信
cg501710 小时前
Spring Boot 的配置文件
java·linux·spring boot
暮云星影10 小时前
三、FFmpeg学习笔记
linux·ffmpeg
rainFFrain10 小时前
单例模式与线程安全
linux·运维·服务器·vscode·单例模式
GalaxyPokemon10 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++
mingqian_chu11 小时前
ubuntu中使用安卓模拟器
android·linux·ubuntu
@郭小茶12 小时前
docker-compose方式部署docker项目
运维·docker·容器
GalaxyPokemon12 小时前
Muduo网络库实现 [十] - EventLoopThreadPool模块
linux·服务器·网络·c++