网络基础1


1.网络发展史

独立模式:以前每台计算机机器都是独立工作的,

网络互联:多个计算机连接在一起

局域网:局部地区在使用一个路由器将各个主机连在一起

广域网:
为了将相隔千里的主机连接起来,用路由器将各个局域网连`	接起来叫做广域网

例子:在国内,我们可以说自己在一个广域网,放在全球,我们在局域网中,两个没有明显的区分。
以太网:

2.网络编程

3.高级IO(多路复用技术)

**接下来走进网络编程**
## 网络协议概念
在生活中,我们也有很多协议,在网络中也一样。
因为在网络通信过程中,通信环境非常复杂,应对的场景各有不同,想要传递各种不同的信息,就需要约定好一个共同的标准。因此导致网络通信中有很多协议。
计算机生产厂商不同,操作系统,硬件设备也很多,如何使这些不同的计算机之间能够顺畅通信,就约定了一个共同标准,这就是网络协议。

网络通信协议:数据在网络中传输的格式,即标准化的约定。

协议的分装:将协议 分装起来,让 协议容易使用。

## 网络协议的分层

按照协议的不同功能,以及不同的使用场景进行一个框架的划分

**两组用于计算机或者通信系统间的国际化体系标准协议模型:IOS七层模型和TCP/IP四层模型,每组模型都是一个协议簇,每组模型中都含有多个协议。**

#OSI七层模型
七层网络模型也称为开放式系统互联参考模型,把网络从逻辑上划分为七层,最大的优点就是将服务,接口,协议这三个概念明显区分开来,可以使不同的系统不同的网络之间实现可靠通信。

应用层

表示层

会话层

传输层

网络层

数据链路层

物理层


但复杂不实用,重点关注TCP/IP四层模式,有的书也分为五层

# TCP/IP四层模型

1. 应用层(对应上边的前三层)负责应用程序之间的数据沟通(htt,ssh,ftp 协议)

2. 传输层:负责端到端之间的数据传输;tcp/udp(port)

所谓端口号就是具有网络功能的应用软件的标识号。注意,端口号是不固定的,即可以由用户手工可以分配,那么为什么要给端口编号来区分它们呢,既然一个程序开了一个端口,那么不是外部信息都可以通过这个开启的端口来访问了吗?答案是不可以。为什么呢?因为数据是用端口号来通知传输层协议送给哪个软件来处理的,数据是没有智慧的,如果很多的程序共用一个端口来接受数据的话,那么当外界的一个数据包送来后传输层就不知道该送给哪一个软件来处理,这样势必将导致混乱。


3. 网络层:功能:地址管理和路由选择; 协议:IP协议;路由器工作在物理层。(主机到主机的通信,用IP地址来识别不同的主机)

4. 数据链路层:相邻的两个结点设备之间的数据传输,即数据上一站到下一站的传输,(负责设备之间的数据帧的传送与识别,遵循以太网协议,交换机工作在物理层

5. 物理层:主要负责光电信号的传递,以太网协议,集线器工作在物理层。

### 网络协议为什么要分层?

层跟层之间联系是通过接口来通信


每层都实现“封装”,更加专注完成完成某项统一的功能。分层最大的好处在于----封装。
当某一层发生变化时,其它层不受影响。

#网络编程套接字

#### 一、认识IP地址
1. IP协议有两个版本,IPV4版本的ip地址4个字节的整数,IPV6的ip地址是128字节,ipv6不兼容IPV4,没有推广。


1. Ip地址在IP协议中,用来表示网络中不同主机的地址。

1. 源IP地址指数据从哪里来,目的IP地址指数据要发送到哪里去。

1. 凡提到IP协议,无特殊声明,默认IPV4


光有两个IP地址就能实现两台主机的通信吗?不能,还需要一个标识符来识别某个进程

#### 二、端口号(Port)
1.无符号端口号是个两个字节的16位整数,用来识别一个进程,告诉操作系统这个数据要交给哪一个进程来处理。

2.一个进程可以绑定多个端口号,但是一个端口号只能绑定一个进程。

3.TCP和UDP中分别有两个端口-----源端口(数据是谁发的),目的端口(要发给谁)




**IP地址在互联网中用来识别唯一的一台主机,端口号用来标识该主机中唯一的一个进程
一对IP地址和一对端口号可以识别互联网中的唯一的两个进程,所以IP地址+端口号就叫套接字,这对套接字就可以实现通信。一对套接字可以识别某台主机上的某个进程。**

**所以套接字的本质就是实现进程间的通信**


五元组:sip(源地址),dip(目标地址),sport(源端口),dport(目标端口),proto(协议),这五个组在一起就可以完成一个通信。



 


#### 三、认识两个协议--TCP和UDP

传输层有两个协议,两个协议各有不同的特点和应用场景,如何协议进行数据的传输,取决于协议的应用场景和当前使用场景

**TCP(传输控制协议)**

协议特点:有连接的可靠传输,传输时是面向字节流

- 保证数据可靠传输
- 有连接(保证两端是连接的)
- 面向字节流(面向字节流------》收发数据比较灵活,数据无明显边界,所以容易造成tcp粘包问题(各种数据都混合在一起);面向数据报----》数据有最大程度限制,接收的时候一条一条的接,所以不会产生粘包问题)

**UDP(用户数据报协议,属于传输层)**

协议特点:

- 无连接
- 不可靠
- 面向数据报传输

**两者对比:**

tcp保证了数据的可靠传输,对数据安全性较高,但牺牲了很多的性能,它的数据传输性能低于udp。(安全性好)
udp传输速度快,实时性高,常用于传输音乐,视频...对数据的完整性要求不是很高,但对实时性要求比较高。(实时性好)
#### 四、网络字节序

大小端的判断:

因为大小端的问题,不同主机上数据存储的大小端不同,可能导致接收数据放入内存时出错,所以在网络传输中,凡是存储大于一个字节的数据都必须存储转换为网络字节序的数据。


所谓网络字节序:规定大端字节序

主机字节序:大小端都有可能


比如发送主机是小端,那么,就需要将数据先转换成大端

# socket套接字编程:

socket是一套接口,用于网络编程的接口,socket也是一个数据结构
需要开始网络编程,第一步就需要先创建一个套接字,创建成功后才可以操作套接字,完成网络上数据的传输

##### UDP协议下的通信


1. 创建套接字
int socket(int domain, int type, int protocol);  //一旦创建成功则就以某种方式打开网卡

参数解释:
Domain:地址域

AF_INET   //ipv4协议
AF_INET6   //ipv6协议


Type: 套接类型

SOCK_STREAM    // 流式套接字,默认TCP

SOCK_ DGRAM   //数据报套接字,默认UDP

SOCK_RAW      //RAW类型



Protocol:协议类型,置0即可,系统会根据第二个参数来自动安排

返回值:成功返回非负数的文件描述符,失败返回-1



2.绑定地址信息

int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
 参数解释:
sockfd:套接字描述符

const struct sockaddr *ad:要绑定的地址信息;dd这个结构体是IPV4版本的地址信息,包括地址域,端口,ip
socklen_t addrlen:地址信息的长度

返回值:成功返回0,失败返回-1;

3.发送数据/接收数据
udp发送数据:ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);

udp接收数据:ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);

4.关闭socket。
# tcp通信----可靠传输,确保可靠,两边互相确定链接

多进程服务端发送请求:
1. 创建:socket
2.绑定:int bind(int sockfd,  const struct sockaddr, socklen_t addrlen);
       第二个参数是一个指向特定协议的地址结构的指针,第三个参数是该地址结构的长度。对于TCP,调用bind函数可以指定一个端口号,或指定一个IP地址,也可以两者都指定,还可以都不指定。
3.监听:listen();
用来接收客户端的连接请求,这个过程由os完成,连接成功后,操作系统会为这个客户端并创建一个socket,建立成功后被放入socket连接成功队列

listen 会在系统里面开辟一个队列,第二个参数就是这个队列最大节点数,这个队列叫连接成功队列,第二个参数功能:同一时间socket的最大并发连接数,不是最大连接数
4. accept(从连接成功队列中拿取出为客户端连接创建的socket,与客户端的数据通信都是通过这个socket来完成的


5.接收/发送

recv;默认是阻塞的,当socket接收缓冲区中没有数据,则等待直到有数据
send:
(把accept后面的代码换成创建子进程)

多线程tcp通信:
创建子进程:在子进程中通过获取的socket连接与客户端进行通信

创建线程:在线程中通过获取的socket连接与客户端进行通信
             
tcp的连接断开检测:
对接收端来说,recv返回值是0,则连接断开
对发送端来说,send会出发broken pipe异常,接收到SIGPIPE信号,程序退出
对于大多数程序来说,断开后应该重新连接

**扩充知识:**
三次握手。四次挥手

四次挥手过程:

sys泛洪攻击
为什么树洞关闭方要等待,TIME_WAIT状态有什么用
为什么是两个MSL,

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值