7.计算机网络
Posted lyndonmario
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7.计算机网络相关的知识,希望对你有一定的参考价值。
一.计算机网络
1.什么是计算机网络:它是计算机技术和通信技术相结合的产物。
2.计算机网络的功能:
a.数据通信
b.资源共享
c.提高系统的可靠性
d.分布式网络处理和负载均衡
3.计算机网络的组成
1.通信子网络:由网卡,线缆,集线器(存粹物理上的),中继器,交换机(),路由器(网络之间的交流)
2.资源子网络:网络中的计算机,打印机等一些可以提供的设备
3.计算机网络软件
协议软件:它规定了计算机之间通信的准则,最常见的协议TCP/IP协议簇
网络通信软件:网络中实现计算机于设备之间通信的软件
网络操作系统:可以提供网络服务的计算机操作系统,常见的网络操作系统,windows server2008(使用简单,有图形界面,鼠标操作,不太稳定) UNIX Linux
网络管理软件和网络应用软件:
管理:防火墙,SELinux
应用:浏览器,迅雷,ftp客户端
4.计算机网络的分类
1.网络的作用范围来分
局域网
城域网
广域网
2.按网络的传播技术来划分
广播式网络
点到点网络
3.传输介质划分
有线网,无线网,微波通信,卫星通信
5.计算机网络的拓扑结构
1.星型拓扑结构
2.树形拓扑结构
3.总线型拓扑结构
4.环形拓扑结构
5.网状型拓扑结构
6.计算机网络的发展过程
1.以计算机为中心的联机系统
2.分组交换网络的诞生
3.网络体系结构与协议标准化
20世纪八十年代,ISO组织提出 开放式系统互连参考模式(OSI),这个模型照顾到了各方的利益,所以太过庞大,因此至今没有推出成熟的产品,TCP/IP符合OSI标准的协议。
异构:操作系统(windows) ->socket->TCP/IP ->TCP/IP -> socket ->Linux
4.高速计算机网络
7.网卡:网络接口卡或网络适配器,它负责讲数据发送到网络中去,也负责从网络中获取数据,每一张网卡上会有一个独一无二MAC地址。
8.OSI/RM结构与TCP/IP模型
OSI/RM结构七层: 物理层,数据链路层,网络层, 传输层, 会话层, 表示层,应用层
TCP/IP模型四层结构:物理层, 网络层, 传输层, 应用层(间隔顺序表示两者相对应的部分)
物理层:负责通信网络收发数据包
网络层:选择,流量控制,与网络拥塞问题,IP协议式该层的核心
传输层:机器之间建立端到端的连接(用于数据间的传输),该层的核心协议TCP/UDP
应用层:主要为用户提供针对性的服务,该层代表性的协议有:HTTP(超文本传输),SMTP(邮件传输),FTP(文件传输),TELNET(远程登陆)
9.IPv4地址
在计算机网络中的每一台计算机都必须有一个唯一的标识符,它就是IP地址。目前由4个不超过255的整数组成,一般用点分十进制表示
ip地址的分类:
A类:
第一二进制位必须是0()
0.0.0.0
127.255.255.255
公网的地址
B类:前两位的二进制位必须是10
128.0.0.0.0
191.255.255.255
大型的,大企业中的网络
C类:前三位的二进制位必须是110
192.0.0.0
223.255.255.255
小公司的网络
D类:前四位的二进制必须是1110
224.0.0.0
239.255.255.255
家庭,小公司的
E类:前五位的二进制必须是1111
240.0.0.0
255.255.255.255
10.公有IP和私有IP
公有IP:在网络服务提供商登记过的IP地址叫公有IP
私有IP:由一些公司自己分配的,不能在网络上公开直接访问的IP地址
11.子网掩码:目前由4个不超过255的整数组成,一般用点分十进制表示(255.255.255.0)
子网掩码&ip地址 = 网络地址
如果两个人ip地址的网络地址相同,那么说明它们在同一个子网内,就可以直接通信而不需要路由
12.网关地址:负责子网出口的计算机,一般由路由器担任(路由器就是一台具有路由功能的计算机)
13.端口号:操作系统为需要通信的进程分配一个独一无二的编号,端口号可以确定与哪个进程进行通信
1-1024基本上已经被操作系统占用了,一般编程要使用1024以上的。
http:80
ftp:21
telnet:23
二.套接字(socket:插座)
是一种可以进行网络通信的内核对象,它有一个唯一的标识符,一般称它为socket描述符,跟文件描述符类似,也可以用read/write/close操作
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
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
{
//通信地址类型
sa_family_t sun_family;
//socket文件路径
char sun_path[108];
}
网络通信地址
struct sockaddr_in
{
//通信地址类型
short int sin_family;
//端口号
in_port_t sin_port;
//ip地址
struct in_addr sin_addr;
}
三.本地socket进程间通信
A(B的地址+消息内容) -> B
B(A的地址+消息内容) -> A
进程A:创建socket -> 准备地址 -> 绑定 -> 连接 -> 接收/发送 -> 关闭socket -> 删除socket文件
进程B:创建socket -> 准备地址 -> 连接 -> 绑定 -> 发送/接收 -> 关闭socket
进程B可以给进程A发送消息,进程B也可以给进程A发消息
一个socket文件只能绑定一个地址
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:把socket对象与通信地址(自己)建立联系
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:与通信目标连接(与目标主机的地址)
四.网络通信(UDP)
点对点通信(C to C)
网络通信地址
struct sockaddr_un
{
//通信地址类型
short int sin_family;
//端口号
in_port_t sin_port;
//ip地址
struct in_addr sin_addr;
}
生成端口号:个人计算机可能是大端,也可能是小端,网络通信时,需要大端数据,必须把数据转换成大端
端口号就是一个16位的无符号整数
uint16_t htons(uint16_t hostshort);
#include <arpa/inet.h>
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位主机字节序
生成IP地址:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
功能:把点分十进制的IP地址转换位32位无符号整数
char *inet_ntoa(struct in_addr in);
功能:把32位的网络字节序的ip地址转换成点分十进制的字符串地址
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
功能:接收数据,并获取发送端的地址
ps:addrlen是参数不是返回值
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
功能:发送数据到指定的目标
进程A:创建socket对象 -> 准备地址 -> 绑定 -> 接收数据和来时的地址 -> 原路返回数据 ->关闭
进程B:创建socket对象 -> 准备地址 -> 向目标发送数据 -> 接收数据 ->关闭socket
当socket对象被全部关闭后会在内核中,停留一段时间(给一个重新连接的机会),如果再使用同样的ip地址和端口号就会失败(延时关闭)
五.网络通信(TCP)
一对多连接(c to s)
面向连接的网络通信,在通信过程中时刻保持连接,这种通信方式类似于打电话,这种通信方式能保证安全可靠数据不丢失,但是与udp相比,它的传输速度略低。
进程A :创建socket —> 准备地址 —> 绑定 —> 监听(设置队列长度) —> 等待连接 —> 进行通信 —> 关闭
进程B :创建socket —> 准备地址 —> 连接 —> 通信 —> 关闭
int listen(int sockfd, int backlog);
功能:设置最大的监听数量
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:等待其他主机与当前socket建立连接关系
返回值:建立好的连接的描述符,此后通信都用此描述符
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:网络通信专用的数据接收
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:网络通信专用的数据发送
当recv/send函数的返回值为-1时,连接断开,此时应该结束死循环
练习:开启一个服务端程序(创建socket,准备地址,绑定,等待连接,创建进程为连接服务器,主进程继续等待连接)
客户端程序(创建socket,准备地址,连接,与服务端通信)
为什么是三次握手:
什么是安全的连接(A要知道:A->B,&& B->A,B要知道:A->B, && B->A)
而这样的三次连接就保证了A和B都知道了上述信息
三次握手:
四次挥手:
1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你不可以马上关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。
TCP三次握手和四次挥手(详解)以上是关于7.计算机网络的主要内容,如果未能解决你的问题,请参考以下文章