linux 总结(四) — — 网络

一、线程安全

线程安全:多线程环境中可以正确的执行   

有同步控制-》线程安全  没有同步-》非线程安全

非线程安全 ,一般由于在函数中使用了静态变量,全局变量引起的

线程安全的函数 可重入函数

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 接受缓冲区还有多少数据 连接状态

发布了93 篇原创文章 · 获赞 45 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41431406/article/details/97381210