一.计算机网络
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三次握手和四次挥手(详解)