linux网络、tcp、udp、cpu ,网络编程模型 、进程、线程总结

1、网络四层模型
(1)、应用层
主要有http、ftp、telent、DNS、smtp等等协议
应用层包含
会话层:用于数据加密、数据编码等等
表示层:用户和其他节点建立关联
(2)、传输层
主要用户数据分组或重组,把报文数据转换成tcp、udp格式,封装请求端的端口
(3)、网络层
把报文数据包装成ip的数据包,和路由包含ip、icmp等协议,封装请求端的ip
(4)、链路层
数据链路层:数据链路层封装请求端的make地址,链路层通过网络层传递过来的数据包解析,获取到ip后进行arp协议,进行全网广播,获取请求端的make地址
物理层:把数据包发送给物理媒体
2、tcp协议
(1)三次握手
linux网络、tcp、udp、cpu ,网络编程模型 、进程、线程总结_第1张图片

Tcp三次握手后即客户端和服务端连接已经建立
(2)四次挥手
linux网络、tcp、udp、cpu ,网络编程模型 、进程、线程总结_第2张图片

(3)time_wait
(1)原理:
客户端发起关闭连接请求后,进入time_wait状态,当服务端收到关闭连接的请求后向客户端回一个ACK,然后服务端向客户端发起一个FIN关闭连接的请求到客户端,客户端收到后发起一个ACK给服务端,但是此时如果网络波动造成ACK没有发生成功,那么由于TCP的重传机制,客户端必须维护这条连接的状态具体而言就是这条连接中四元组中的两个(local_ip,和local_port)不能被立即释放或重新分配,只到服务端重新发送了FIN,然后客户端发送ACK成功了那么客户端状态才变成colse,如果客户端不进入time_wait状态,那么当服务端发送了FIN后。客户端一RST包回复服务端,这个包会被服务端认为是有错误发送,其实这是正常的连接关闭
(2)总结:
其实当客户端发起一个colse请求后,客户端进入time_wait状态,此时tcp四元组不能被重新分配和创建,数据包在网络中保存2msl时间,只有到2msl时间超时,四元组才会被再次创建,保证了相同的四元组前后两次创建而不会错乱
(4)大量的time_wait:
高并发短链路的服务器上,如果并发特别高,在一次http请求中处理业务时间加数据传输时间大于time_wait超时时间,当短链接关闭后,短链接使用的端口号会被time_wait占用一段 时间后才会释放,由于服务器可用端口0~65535,除去系统占用和其他服务占用,可以使用的更少,当端口被占用完后,服务器会拒绝一些链接
(5)解决大量出现time_wait:
1、部署多个到多个服务器,通过负载均衡做分发
2、修改系统配置文件sysclt.conf (1)开发当出现syn队列溢出时开启syn cookies,减少syn攻击(2)、设置允许time_wait sockets重新启用(3)设置允许time_wait sockets快速回收(4)、修改time_wait超时时间
3、udp
udp传输数据是不安全的,只是负责把数据扔到网络中去,不保证数据是否安全到达,可能会出现丢包。速度很快,不会出现阻塞,常用做ip电话、视频会议、直播等,支持一对一、一对多、多对多、多对一等。tcp只支持一对一,传输的是报文数据,tcp传输的是字节流数据。

4、进程线程
(1)、进程:
进程是线程的容器,是计算机进行资源分配和调度的基本单位。
(2)进程之间的通信8中ipc
1、匿名管道通信
匿名管道通信只能是有亲缘关系的进程之间类似父子进程之间才可以通信,并且数据流向是单项的,即父进程往管道里面写数据,子进程从管道中读数据,创送的数据时无格式的流数据
2、有名管道通信
和匿名管道唯一的区别就是可以在没有亲缘关系的进程之间进行通信
3、高级管道通信
高级管道通信就是程序创建一个新的进程到当前程序的进程中。
4、信号
这种通信比较复杂,主要是用于通知和接受进程中的事件
5、信号量通信
信号量通信其实就一个计数器,每次通信进行计数,用于控制多个进行操作共享数据。其实就是一个锁,用于实现进程或同一进程中的多个线程的同步操作
6、共享内存通信
通过一个进程提供一个共享内存区域,然后多个进行来共同使用这个共享内存。常和信号量通信一起使用,保证共享区域操作数据安全
7、消息队列通信
用在内核中存在消息链表,并且由消息标识标记,消息队列是用于弥补信号量承载信息少和管道通信只能传输无格式的字节流数据和缓存区受限二设计
8、套接字(socket)通信
套接字通信和其他ipc通信不同的是,可以用于不同服务器之间进程与进程进行通信
(3)、线程:
线程是存在于进程中的,在同一进程中,所有线程使用共同的内存空间,是计算机中用于调度计算的最小单位
(4)Java中的线程的通信方式
线程之间通信通过wait、notify、notifyall进行通信,其中wait回让出cup让其他线程运行。
synchronized实现同步通信、生产者消费者通信、volatile关键字、等
5、linux常用的操作命令
1、ps查看进程
2、jps查看java进程
3、ifconfig 查看硬件信息
4、top查看cpu使用情况
5、mv移动
6、df -h 查看磁盘信息
7、free -h查看内存使用
9、ipcs查看负载信息
10、vmstat 查询io
11、lsof -i 端口号 查看端口占用情况
12、netstat 查看端口
6、机组
1、计算机组成
linux网络、tcp、udp、cpu ,网络编程模型 、进程、线程总结_第3张图片

2、计算机内部组成
linux网络、tcp、udp、cpu ,网络编程模型 、进程、线程总结_第4张图片

(1)cpu和内存
cpu通过cp(指令地址)地址去内存中获取要执行的指令,然后把内存中对应指令的数据复制到cpu的寄存器中,然后再通过ALU去运算
(2)cpu缓存
linux网络、tcp、udp、cpu ,网络编程模型 、进程、线程总结_第5张图片

Cpu中有L1 cache一级缓存、L2 cache 二级缓存、L3 cache 三级缓存
其中速度 :寄存器大于L1速度大于L2大于L3
一个cpu可能有多核,每个核有多个线程,其中L3一个cpu共享一个,L1和L2属于每个核。
(3)cache line缓存行 即缓存行对齐
linux网络、tcp、udp、cpu ,网络编程模型 、进程、线程总结_第6张图片

说明:缓存行,即cpu每次读数据是一块一块的,cpu不同厂家块的大小不同,比较像Inter每个缓存行的大小是64k
缓存行对齐:在开发过程中为了保证程序执行高效,对数据补齐到缓存行大小】
缓存一致性协议:就是在多核cpu并发执行任务时为了保证数据安全,采用缓存一致性协议,
缓存一致性协议有很多,不同的cpu厂家不一样,像inter的MESI cache一致性协议,这个协议有四种状态 modifed(数据被修改了)、Excluslve(代表该缓存行对应内存中的内容只被该CPU缓存)、Shared(该状态意味着数据不止存在本地CPU缓存中,还存在别的CPU的缓存中)、Invalld (代表该缓存行中的内容时无效的)
如上图所示:
当把前面L1的数据修改后,会通知后面的L1修改状态,并且前面L1会把修改的数据写到L2、L3和内存中。当后面的L1在读取数据时发现状态无效则,会去内存中获取数据覆盖本地数据,这个操作就是inter MESI缓存一致性协议
上属如果不能解决并发问题,可以通过lock锁总线来保证数据安全,锁总线效率比较低
(4)指令重排序
当我们在创建一个对象的过程中cpu在执行的过程中可能会出现指令重排序,例如单例中的DCL 需要通过volatile来修饰,指令重排序cpu层面是通过内存屏障来实现的,思路可以把指令放入队列来保证按顺序执行。
7、网络编程模型
1、linux网络编程常用命令
用于查看应用线程调了那些协调调用
#strace -ff -o out java xxx(要查看的class名,不包含后缀)
查询进程
#netstat -natp
建立连接等待
yum install -y nc 安装
$nc www.baidu.com 80
请求返回连接
#curl www.baidu.com:80
抓取80端口数据包
yum install -y tcpdump 安装
ifconfig -a 查看网卡
#tcpdump -nn -i eth0 port 80
在这里插入图片描述

查看网络号
#route -n
linux网络、tcp、udp、cpu ,网络编程模型 、进程、线程总结_第7张图片

2、TCP编程
(1)客户端和服务端交互
linux网络、tcp、udp、cpu ,网络编程模型 、进程、线程总结_第8张图片

说明:tcp交互过程中其实客户端和服务端拿到的数据时存在于队列中的信息,而不是直接从网络中获取,如果用户不主动去队列中获取,那么队列中的数据会一直
3、BIO(同步阻塞)
Java中通过创建ServerSocket
bind通过绑定端口
accept调用进行阻塞等待客户端连接
对应到内核中
linux网络、tcp、udp、cpu ,网络编程模型 、进程、线程总结_第9张图片

问题:
1、当有多个客户端要连接就需要在创建线程来处理,这样一个客户就要一个线程,线程太多会造成资源浪费
2、Nio(同步非阻塞)
(1)nio模型
Java中通过创建serverChannel
bind通过绑定端口
设置configbloking设置为false为非阻塞
accept调用进行阻塞等待客户端连接
对应到内核中
linux网络、tcp、udp、cpu ,网络编程模型 、进程、线程总结_第10张图片

优点:规避了多线程资源浪费问题
缺点:假设1万个连接只有一个发来数据,每次循环一次,其实每次必须向内核发送1万次recv的系统调用,那其中9999次无意义,浪费时间和资源
(2)多路复用
1、Select、poll模型
Java中通过创建serverChannel
bind通过绑定端口
While
获取select
判断是注册客户端还是客户端读、写
linux网络、tcp、udp、cpu ,网络编程模型 、进程、线程总结_第11张图片

优点:通过一次系统调用,把所有的fd(文件描述符)传递给内核,内核进行遍历,这种遍历减少系统调用次数。
缺点:
1、重复传递fd,每次有客户端连接都要传递一次。解决方案内核开辟空间存储fd
2、每次select、poll,都要重新遍历全量全量fd(中断、callback、增强)
2、epoll模型
Redis、nginx、底层用的都是epoll
linux网络、tcp、udp、cpu ,网络编程模型 、进程、线程总结_第12张图片

说明:epoll工作原理,会在内核中开辟一个空间,有客户端注册来了以后添加到这个空间里面,然后有读写时间也添加到这个空间
4、netty
使用线程模型boss 只能有一个 work可以有多个
1、单线程模型
接受新的链接,和读写操作只有一个线程处理
2、多线程模型
多个线程来处理读写,一个线程处理accept,新的连接
3、主从多线程模型
其实就是accep,接受新的连接不在是一个单线程处理,而是一个线程池处理
4、消息粘包、拆包
(1)粘包、拆包造成原因

粘包、拆包就是应用程序从内核和服务端建立tcp连接后开辟的队列中读取数据时不能正确拆分造成
(2)粘包、拆包解决
1、客户端和服务端在传递消息过程中通/r/n做结束
2、发送消息的时候代请求头,在请求头中传递信息的长度
3、通过fixedLengthFrameDecdoder编码器netty提供的编解码器
8、https协议
Ssl、tls、Https 、x.509
ssl实现了https中的s进行网络数据加密
tls是ssl的升级版它遵从了x.509规范
Opessl实现了ssl,是一个工具
https其实就是基于tcp加ssl实现

你可能感兴趣的:(linux,tcp,udp,进程,线程,多线程,linux)