一、线程安全
线程安全:多线程环境中可以正确的执行
有同步控制-》线程安全 没有同步-》非线程安全
非线程安全 ,一般由于在函数中使用了静态变量,全局变量引起的
线程安全的函数 可重入函数
strtok_r函数是strtok函数的可重入版本。strtok_r实际上就是将strtok内部隐式保存的this指针,以参数的形式与函数外部进行交互。由调用者进行传递、保存甚至是修改。需要调用者在连续切分相同源字符串时,除了将str参数赋值为NULL,还要传递上次切分时保存下的saveptr。
线程同步:当多个线程访问临界资源时,有控制保证在同一时刻只有一个线程访问
eg:红绿灯 信号量......
解决线程安全的方法:
1.同步线程2.使用线程安全函数
fork()与线程
线程:在进程内部,如果要干多件事情,就需要运行多个子任务,我们就把这些子任务叫做线程,线程共享所属进程内的内存空间
在多线程程序中,某一条线程调用fork()生成子进程也就是线程,在子进程中,只有调用fork()的线程会被启动,子进程会继承父进程的锁及其状态,子进程锁的初始状态和父进程相同 一般会在不用锁的时候进行复制
多线程中,fork(),复制的子进程只有一条执行路径,就是fork()所在的那条执行路径
写时拷贝
Fork()都复制哪些资源?
Fork()函数在生成进程时,采用了写时拷贝技术:不执行一个父进程数据段,栈和堆的完全复制,这些区域由父子进程共享,而内核将他们的访问权限改为只读的,如果父子进程任意一个进程试图修改这些区域,则内核只给修改区域的内存制作一个副本,以页为单位进行复制。
数据复制(全局变量) 代码共享(未修改) 写时拷贝
线程创建函数是pthread_create()函数,该函数的原型为:
int pthread_create(pthread_t *thread,pthread_attr_t *attr,void* (*start_routine)(void*),void *arg);
创建线程的参数?
线程id 线程属性(一般为null) 运行函数的起始地(线程函数) 运行函数的参数(一般为null)
-lpthread 线程库
查看线程:
top -H:实时显示各个线程情况
让top输出某个特定进程<pid>并检查该进程内运行的线程状况:top -H -p <pid>
ps -elf: -e 代表列出所有进程,-l 代表长格式,-f 代表完整的格式,有时候也用 -F 代表超完整的格式。
二、网络
网络:将独立自主的计算机连接起来
互联网:将网络和网络连接起来
分层 :7层模型 :应用层 表示层 会话层 表示层 数据链路层 物理层
4层模型 :应用层 传输层 网络层 数据链路层 物理层
为什么要分层?每层的协议?
将大网络分层小模块,便于实现
分层 底层的功能可被复用,
参考资料:https://www.applysquare.com/topic-cn/V9UHWe49W/
ip地址:在网络中唯一标识一台主机
MAC地址(物理地址) 48位 网卡接口(水晶头) 唯一标识一台主机
ARP协议 地址解析协议 ip->物理地址
RARP协议 逆地址解析协议 物理地址->ip地址
《linux高性能服务器》 第一章tcp/ip协议簇
《计算机网络 第五版 》3 4 5 6 章
网络层:主要实现 数据包的选路和转发
ip协议(因特网协议) Ipv4头部的详细信息?画图 《LiNux高性能服务器》p18 Ip报头
icmp 因特网控制报文协议是对ip的补充,主要用来网络连接 ping 主要通过他完成
CRC 循环冗余校验 奇偶校验
传输层为两台主机上的应用程序土工端到端的服务(进程间通信的服务)
端口:标识一个应用程序 是应用程序的代号
常用端口:
两个应用程序传输的流程
Tcp 传输控制协议:面向连接的,可靠的,流式服务
可靠:超时重传,应答确认,滑动窗口进行流量控制
面向连接:在通信之前,先建立连接->通过三次握手建立连接->断开->四次挥手
Tcp和udp的区别、特点
Tcp是面向连接的,可靠的流失服务
面向连接:在通信之前,必须通过三次握手建立连接
流式服务 ?数据没有边界限制,可以从一端不断的发送到另一端 可能出现粘包
数据包没有明确的起始和末尾,多次发送的数据可被对方一次性接受
粘包问题?
解决:1.send/recv/send 2.数据添加头和结尾
Udp协议:用户数据报协议
特点:无链接 不可靠 数据包服务
STCP 流控制传输协议
Udp如何像tcp一样提高可靠?
传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。
实现确认机制、重传机制、窗口确认机制。
Connect执行,开始三次握手
三次握手哪些阶段可能收到攻击
第一个Syn发的多 半连接 将未完成三次握手队列占满 syn溢出攻击
为什么是三次,不是两次?
TCP是全双工的,只有三次才能保证双方可以正常的建立连接,收发数据
四次挥手,可不可以是三次?
可以,当本端关闭了连接,恰好也同时收到了对方 的 FIN 报文,此时可以把自己的 FIN 和给对端的确认 ACK 合在一起发送。就变成了三 次。
四次挥手哪个阶段可能受到攻击?
最后一个Fin攻击 释放不出端口号
Time_wait状态存在的意义? 2msl(最大报文生存周期)
可靠的终止tcp 2.能够让迟来的报文被识别并丢弃
eg:对讲机
C ->S: 你能听到吗?
S->C: 听到。你能听到我吗?
C->S:听到。
详细请参考之前的博客:https://blog.csdn.net/qq_41431406/article/details/86523634
Tcpdump 抓包
Tcp报头
fin失败 RST 请求重新连接
若有紧急数据指针 可越过
Netstat -natp 接受缓冲区还有多少数据 连接状态