一、什么是互联网
一、什么是互联网
1、计算机网络的定义
2、计算机的分类
1)按照作用范围分类
个人局域网:热点
2)按照网络的使用者分类
公用网:缴费可以使用的网
专用网:军队
3、网络的网络
由节点和链组成
互联网:网络的网络
1)路由器也是计算机,但不是主机,传输数据是从主机到主机,但路由器是转发作用
2)什么是互联网
3)
边缘部分:主机
核心部分:广域网
4)边缘部分:主机-端系统
端系统有很大的区别,小的主机、摄像头,大的可能是昂贵的计算机
端系统的拥有者可以是个人、单位、isp
4、互联网基础结构发展的三个阶段
1)APPAnet
最初是分组交换
一个分组一个分组的发,最后在组装到一起
83年,TCP/IP协议以后,单个分组交换变成网络互联,90年APPnet结束
2)NSFnet
90年后,大型公司入驻,美国政府淡出运营
3)互联网服务提供者ISP
科研-收费公用
主干ISP全球有十几个:电信、移动、联通
地区ISP大概有十几万个
IXP:互联网交换点,方便地区ISP之间的交换
内容提供者:抖音、快手
需要服务器存放大量视频,需要庞大的网络,跟各级ISP相联,ISP越多,效率越高
4)万维网
信息的传递从文字到声音、视频
二、OSI七层体系结构
一、网络体系结构的形成
(一)计算机网络体系结构的形成
1、两个计算机之间通讯要解决很多问题
2、解决上述问题-提出了分层结构
74年,SNA-APPnet出现但是TCP/IP还没有出现
3、83年,ISO/OSI七层体系结构
此时TCP/IP还没有出现,ISO失败了
失败原因:90年代后,互联网的形成,时常被TCP/IP占领等
4、OSI变成了国际标准
(二)协议与划分层次
1、
1)语法:数据与控制信息
1+名字/2+内容
2)语义:何种控制信息
3)同步:发送之前同步发送内容,双方协调
2、协议的两种形式
3、复杂的计算机网络是层次式的
4、透明传输-QQ、微信传输
文件传输模块:文件大小、格式、名字-QQ/vx
通信服务模块:知道文件发给谁-地区信息-系统
网络接入模块:负责网络接口细节,向上层提供接入和通信服务-网络接口
5、各层需要完成的功能
1)差错控制:转发错误、数据错误
2)流量控制:发送和接收速率
3)分段和重装:下载进度条,下载完整合
4)复用与分用:
复用-一个东西被多个人使用
分用-一个人提供多个服务
tcp协议为不同应用服务是分用,不同应用服务使用同一个协议是复用
5)建立链接和释放:交换数据前后
6、计算机网络的体系结构
二、协议与划分层次
网络的体系结构:各层及其协议的构成
实现:遵循体系结构,用硬件和软件实现
三、OSI七层体系结构
1、除了互联网、局域网内部也可能会分层,局域网可能需要OSI模型
2、传输层/运输层
3、高层负责主机之间的数据传输,底层负责网络之间的数据传输
4、文件传输模块对应高层,通信模块和网络接口模块是底层
5、高层是本地,交给下层的数据或者怎样解析交付的数据,低层,交付的数据怎样发送出去,怎样接收数据交给高层。
6、高层
1)应用层:QQ可以聊天,抖音可以刷视频,浏览器可以浏览网页
2)表示层:QQ聊天的文字数据、抖音视频数据,接到数据后的表示
应用层处理数据,将数据变成视频,变成文字,下层数据越小传输效率越高,表示层就负责压缩和表示
3)会话层:本地的不同应用之间的通信
7、低层
1)传输层:负责数据的传输,上层应用把数据交给传输层,面对不同应用,对端口标注,不同应用对应不同端口
差错校验:端口号
2)网络层:标注不同网络的不同主机IP,从北京到上海,目的地和出发地相当于两个主机,可以寻址,如何将数据从一个IP传到另一个IP
差错校验:地址
3)数据链路层:从北京到上海,出门做那趟公交,每一段怎么走,建立数据传输的通道,管理节点之间或节点和路由器之间数据传输
差错校验
4)物理层:比特流,高低电平、频率
但是物理层还是软件层面的工作,物理传输是传输媒体的工作。物理层考虑怎样解释0和1。
三、TCP/IP协议与五层体系结构
一、TCP/IP协议族四层体系结构
1、tcp/ip和osi对等关系
2、
1)实际上TCP/IP实际只有三层,网络接口层没有内容,链路层使用的各种局域网标准由IEEE委员会下属工作组负责
2)路由器只参与数据转发,不参与数据处理
3)TCP/IP协议的改变
例:Ping命令
不需要传输层,只需要网络层协议
4)理念:网络的核心部分越简单越好,IP层只只负责主机到主机之间的地址
把IP封装好,可以支持多个运输层的协议,多个运输层的协议也可以支持多个应用层的协议,IP向下又支持多个网络,有线/无线
IP支持各种异构网络,只要实现IP,就可以介入互联网
二、五层体系结构
1、应用层-应用层之上是应用APP
1)应用完成特定的功能,定义的是应用进程通信和交互的功能
2)交互的是报文
3)协议:DNS,HTTP,SMTP
2、运输层-UDP/TCP
UDP:不可靠
TCP:可靠传输
进程间的通信-用户数据宝
差错:端口号的正确性
3、网络层
IP数据报-主机和主机之间
差错:IP地址的正确性
4、链路层-节点和节点之间
差错:比特差错
0010-0100
1)丢弃出错
2)可靠传输-检查出错
封装成帧
5、物理层
数字信号-模拟信号
6、服务器提供服务
四、IP地址与端口号
五、socket套接字及TCP实现框架
一、socket套接字
(一)socket套接字
1、本阶段的编程基于应用层的编程实现
2、体系结构:各层及其协议
实现:遵循体系结构,硬件或软件完成
3、常见的网络编程接口
4、socket套接字-抽象概念
socket在五层结构中上面是应用层,下面是传输层,由内核负责
socket用于实现各种功能
(二)socket常用API介绍(函数接口)
1、AIP
可以通过以上函数写中继程序代码
1)创建套接字-设置套接字类型-协议0
2)绑定通信结构体-通信结构体是IP地址和端口号-定位进程
3)3-4函数用于服务端
4)向服务端发起连接请求-用户端
2、三元组
这里的协议主要是TCP和UDP协议
和socket所在的层位置相关
3、绑定ip地址和端口号
通用地址族结构体
sa_family:
AF_UNIX:本地通信
需要文件地址
AF_INET:IPv4
AF_INET6:IPv6(基本不用)
因为绑定通信结构体不能区分本地还是网络,所以有一个通用,然后强制转化
addrlen参数:是用来统一不同的通信方式结构体宽度不同的问题(ipv4/ipv6)
3、网络编程的套接字
TCP/UDP/原始套接字
原始套接字可以访问底层协议
用ICMP实现ping命令
流和数据报套接字都不需要设置协议,一对一,原始套接字对网络层有多个协议可以选择
4、套接字也属于一种文件类型
(三)TCP通信的实现过程
(一)服务端
1、创建套接字只能用socket--返回的是大于0的整数,是一个文件描述符
2、bind:绑定函数,定义通信结构体,绑定到fd上(ip,端口号,协议)
3、listen:服务器函数,tcp服务器和客户端的区别,TCP服务器是一对多,需要建立连接,用队列管理元素
listen负责队列的长度
sockfd:套接字
backlock:长度
4、accept:真正实现通信,把客户端出队,生成newfd套接字,和客户端一对一连接,accept之后才能真正和客户端连接
处理客户端发来的信息,出队队列的地址信息
(二)客户端
1、connect
不需要socket
和绑定函数参数相同
函数总结:
1、int socket(int domain,int type,int protocol);
根据指定的地址族、数据类型和协议来分配一个套接字的描述字及其所用的资源的函数
domain:协议族/域:AF_INET(IPv4),AF_INET6(IPv6),AF_UNIX(本地)
type套接口类型:TCP协议、UDP协议、protocol:一般为0。
2、int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);绑定通信结构体,套接字绑定到一个ip,并制定一个端口号。
3、int listen(int sockfd,int backlog);监听套接字,使主动连接套接字变为被动连接套接字,使一个进程可以接收其他进程的请求。
典型的服务器程序可以同时服务于多个客户端,当有客户端发起连接时,服务器调用的accept()返回并接受这个连接,如果有大量的客户端发起连接而服务器来不及处理,尚未accept的客户端就处于连接等待状态,listen()声明sockfd处于监听状态,并且最多允许有backlog个客户端处于连接待状态,如果接收到更多的连接请求就忽略。listen()成功返回0,失败返回-1。
4、int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);处理客户端发起的连接,生成新的套接字,用于服务端,接收客户端的连接请求,成功返回一个sockfd为文件描述符,用于和客户端通信。
5、int connect(int sockfd,const struct sockaddr,socklen_t addrllen);向服务器发起连接请求
二、TCP通信的实现过程
六、TCP服务器的实现
一、TCP服务起的实现(理论)
(一)socket函数与通信域
1、socket函数
1)协议为0,流式对应唯一的TCP
2)通信地址族
(二)bind函数与通信结构体
通用地址族
1、 通信地址族和通信结构体的关系
2、强转
3、IPv4地址族-三元组
示例:
(三)listen函数和accept函数
backlog:任意函数
二、TCP服务器的实现代码
1、本地环回地址
2、服务端代码结果
空格两次因为buf缓冲区自带一次换行符
3、服务器代码
三、TCP服务器客户端代码
1、客户端的实现要在服务端打开的情况下
2、客户端代码
四、代码优化
1、ip,端口号用main传参的方式
2、三个参数分别是./server ip 端口号
3、优化结果
4、优化代码
client.c
server.c:
七、TCP并发实现
一、TCP多进程并发
1、关闭服务端客户端,先关客户端再关服务端,先关服务端再关客户端,会出现服务端仍然再使用,影响下次使用
解决办法:
2、使用父子进程循环创建并发进程
客户端代码不变,服务端代码:
2、accept接收客户端函数
1)定义两个变量
2)设置ip
3、把代码放到网络上运行
将目录下的所有文件上传到申请的服务器中
实现网络通信:
服务器本地测试:
注册端口号1024~49151
动态端口号49151~65535
服务器上的端口是注册端口号
二、僵尸进程处理
当客户端关闭,子进程结束,但服务端没有关闭,父进程没有回收子进程,会产生僵尸进程
解决:
增加信号机制
SIGCHID:子进程结束,通知父进程
sigaction信号函数
替换为signal函数
三、TCP并发多线程
代码:/net/server1.c
八、实现UDP通信
一、函数接口扩展与UDP通信实现流(一)write/read到send/recv
前三个参数:send和read相同,recv和write相同
MSG_PEEK:123读走,下次还是123
(二)sendto与recvfrom
struct sockaddr *arc_addr:
recvfrom:相当于把接收到的客户端的信息放到了结构体内。
sendto:发送到通讯结构体指定的套接字中
(三)UDP通信的实现过程
1、置空函数
bzero();
头文件:#include<strings.h>
2、atoi:将数字字符串转换成整数
‘8888’->8888
3、htons:网络字节序和主机字节序的转化
4、inet_aton:将点分十进制的字符串转换成一个32位的网路字节序的二进制
5、如果需要缓冲区,缓冲区是需要定义的
BUFSIZ:8192
二、UDP服务器代码
三、UDP客户端代码
服务端客户端通信:
关闭客服端重启,服务端依旧可以收到(和tcp不同)
客户端代码:
九、TCP是如何实现可靠传输的
个功能
URG:紧急指针,置1有效,有一个紧急数据/命令
ACK:确认号,ACK为1,确认号有效
PSH:数据传完了,可以交付给应用,再确认信息中,客户端接收到服务端的缓冲区将满,催促服务端刷新缓冲区
RST:TCP通信过程中发生错误,置1中断
SYN:置1,发起一个连接请求,三次握手
FIN:置1,断开连接,四次挥手
8)紧急指针:紧急数据写到最前
面,紧急数据从哪结束,紧急指针是结束位置
9)窗口:窗口的大小,一次性发送数据的大小
10)检验和:检验TCP数据包的数据是否正确,没有问题交给应用,链路层检验的是bit位,网络层只检验包头,运输层检验整个数据包,以2字节进行计算,和链路层双保险,简单检验。
八股文:csdn-TCP协议中可靠传输的原理
十、TCP连接管理与UDP协议
一、三次握手
1、序号:seq
确认号:ack
2、连接建立-三次握手
三次握手可以避免:A发送一次,由于没有收到ACK,重新发送,导致B收到重复的报文
3、三次握手的过程
1)服务端创建序列打开
2)客户端发送连接请求报文段
SYN:请求连接
SYN置1,不携带数据,弹药消耗一个序号
3)服务器回应
seq:服务器的序号是y
ack=x+1
y也被消耗1
4)客户端发送
下次发送数据从y+1开始
ACK:一个信号
ack:数据序号
建立连接:
避免SYN请求再次发送
二、四次挥手
1、通讯结束后,通讯双方都可以发起释放连接
2、四次挥手过程
1)第一次回收
tcp不携带数据也会消耗一个u
2)二次挥手
3)三次挥手
A处于关闭状态,没有数据要再次发送,C处于半关闭状态,可能有数据还未发送
4)四次挥手
A收到报文后发送一个确认
确认重传
四次挥手,中间的两次有可能会合并,C发送的数据只有几个字节,有可能和二次挥手一起发完
3、定时器
MSL:最大报文生存周期,C的第二次,没有收到第四次确认,可能重传第三次
2MSL:发送第四次后,C没有接收到,2MSL周期内没有冲床,说明第四次没有问题,第四次重传时间也不会超过2MSL
4、保活计时器
2小时内没有发送客户信息,发送探测报文,没有相应,客户端出现故障,终止连接
三、wireshark介绍
1、运行抓包工具wireshark
sudo wireshark
2、设置抓包内容为icmp
3、ping虚拟机抓包
正好四次:
四、wireshark抓包实验
1、虚拟机巡回抓包不会显示,因为数据不过网卡,只有过网卡的数据才会有显示。
2、https的端口号是443,用的是tcp协议,访问自己的端口号小于1024,需要加sudo
3、连接百度,抓包
4、三次握手
5、四挥手
五、UDP协议
1)无连接
2)不保证可靠交付
3)面向报文,UDP一次交付一个完整的报文
4)没有拥塞控制
5)一对一,一对多,多对多
6)首部开销小,只有8个字节
发送和接收都是一个报文
长度:UDP数据报的长度
检验和:检验数据包的正确性
伪首部:UDP长度和长度相同
十一、IP协议与ethernet协议
一、IP包头-IP数据报的首部格式
(一)IP协议作用和意义
1、链路层-IEEE802组织
2、互联网络
1)路由实现的是ip协议,加路由转发协议等
2)无论是有线还是无线传输,都需要用到ip网
3、透明传输/互联网
TCP/ip的一个含义:运输层和网络层
卫星传输数据,路由接收
(二)IP数据包首部格式
1、版本:一般是IPv4
2、首部长度:4字节*5最少20字节
有可选字段
3、区分服务:优先级
一般情况不使用,使用时才起作用
4、总长度:16位,0~65525
5、标识:16位,随机数,相同的标识是一组
标志:3bit,目前只用了2位
MF:MF = 1,后面还有分片
MF = 0,最后一个分片
DF(最低位):DF=0允许分片
片偏移:8个字节为偏移单位
7、生存时间:
有些数据不能到达目的地,会在路由之间游走,生存时间可通过路由器数量,最大255,每跳一次减一
8、协议:交付或者接收是标记TCP/UDP或者其他协议
9、首部检验和:只检验首部
10、协议字段指出将数据部分交给哪一个进程
11、ip协议的子协议:ICMP、IGMP
(三)IP数据报分片
1、为什么要分片:在网络中传输,路由器转化数据,但是路由器没有
主机内存大,CPU高,所以内存要更高效的利用
2、MTU是ip数据报的最大长度-1500
3、ip分片
最大数据段是1400
二、以太网包头-链路层协议
1、广播信道-以太网
2、以太网的MAC帧
链路层数据长度最大是1518,MTU1500+目标、源、类型、FCS
最小是64字节
FCS内有CRC算法,循环冗余校验
3、
帧的长度不是整数个字节:由物理层提交,不能多bit
以太网不负责重传丢弃的帧
十二、UNIX域套接字
一、UNIX域套接字理论
(一)流式套接字
只需要套接字文件的路径,不需要ip和端口
(二)域套接字
二、UNIX域流式套接字实现
man bind:示例代码
server代码:
客户端:
实现代码:
三、UNI域数据报套接字实现
1、写入代码