网络编程相关

socket

socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用来实现 进程在网络中通信。

csrf攻击是什么,怎么预防

csrf攻击指的是用户在打开某个受信任网站登录后,未关闭浏览器情况下,打开了攻击者的网站,其返回的数据中,包含攻击代码,携带着该用户的数据访问了受信任网站。

预防方案可以是,我们网站的post请求都要带一个csrf的key,其对应一个value是随机字符串的隐藏标签,如果有这个标签才能提交。django框架的预防就是这种方案。

xss攻击,怎么处理

xss攻击是利用网页的漏洞,将一些攻击性代码放入网页中,当用户执行网页的时候,攻击性代码也随之运行,从而达到攻击效果。通常情况,这些恶意程序是js,java,VBScript等等。Django框架已经帮我们处理了xss攻击,django利用escape转义来处理。就是把代码转成实体,让他不具有代码的功能,比如

<div>是html的关键字,那两个箭头可以转成特殊符号&lt;和&gt;

arp协议

根据接收到的ip地址,查找对应的mac地址的协议,他是一个和网络层,数据链路层关联的协议。arp协议会通过广播,在自己的局域网内,获取到ip地址的mac地址。在linux下使用tcpdump抓包,可以看到arp协议广播只有两句:

21:36:56:844580 ARP,Request who-has 192.168.150.2 tell 192.168.150.11 length 28
21:36:56:844580 ARP,Reply 192.168.150.2 is-at 00:50:56:f7:53:2b length 46

tcp-三次握手四次挥手

三次握手:握手过程中使用了 TCP 的两个标志 :SYN和ACK

若在握手过程中某个阶段莫名中断, TCP 协议会再次以相同的顺序发送相同的数据包。

  • 第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。
  • 第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。
  • 第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,完成三次握手。

四次挥手:由于TCP连接是可靠安全的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。先进行关闭的一方将执行主动关闭,而另一方被动关闭。

  • 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
  • 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。
  • 服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
  • 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

tcp协议

是位于传输层的,面向连接的(这里一定要聊三次握手四次挥手),可靠的传输协议。

tcp-为什么三次握手而不是两次

我认为,第三次握手时为了防止已失效的连接请求报文段有传送到B,因而产生错误。

所谓“防止已失效的连接请求报文”是这样产生的。考虑一种正常情况。A发出连接请求,但因连接请求报文丢失而未收到确认。于是A再重传一次请求连接。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接。A共发送了两个连接请求报文段。其中第一个丢失,第二个到达了B。没有“已失效的请求连接报文段”。

现假定出现一种异常情况,即A发出的第一个请求连接报文段并没有丢失,而是在某些网络结点长时间滞留了,以至到连接释放以后的某个时间才到达B。本来这是一个已失效的报文段。但B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了。

由于现在A并没有发出建立请求的连接,因此不会理睬B的确认,也不会向B发送数据,但B却以为新的运输连接已经建立了,并一直等待A发来的数据。B的许多资源就这样白白浪费了。

io模型

BI/O(阻塞IO)

在等待数据的时候,一直在等待,如果已经有数据,就等着从内核缓冲区复制到用户缓冲区,如果没数据,就等着cpu先去把数据获取到内核缓冲区,再等着数据从内核缓冲区复制到用户缓冲区。

NI/O(非阻塞IO)

在等待数据的时候,可以切到其他地方运行。即如果此时没数据,就管自己做事情,且每隔一定时间发送询问是否有了数据,也就是轮询。当多次询问后,数据已经到了内核缓冲区。那么就等着数据从内核缓冲区复制到用户缓冲区(此个过程就不能去做其他事情了)

Multiplexing - I/O(IO多路复用)

类似BIO,只不过找了一个代理,来挂起等待,并能同时监听多个请求。数据从内存缓冲区复制到应用缓冲区期间进程阻塞。

多路复用主要有三种模式

1.select---主要通过轮询的方式线性扫描非常慢,监听数量有限,而且并不是线程安全的,把一个

sock加入到select中后,如果另一个线程发现sock不用

2.pool--本质上和select没有区别将传入的数组拷贝到内核空间,然后查询每个fd(文件描述符)对应的状态,就绪态就在等待队列中加入一项继续遍历没有就绪态就再次遍历一下fd,重复多次无意义的遍历,poll还有一个特点是"水平触发" , 如果报告了fd后 , 没有被处理 , 那么下次poll时会再次报告该fd

3.epool--更加灵活支持水平触发和边缘触发,最大的特点在于边缘触发,只告诉进程哪些fd刚刚变为就绪态,只通知一次,还有一个特点是通过epoll注册fd,一旦该fd就绪,就会采取回调机制来激活fd,epoll_wait便受到了通知epoll的优点是没有连接限制,效率提升,不是轮询方式,只有活跃的fd才会调用callback函数,利用mmap()文件映射内存与内核空间的消息传递,减少复制开销并且是线程安全的

AI/O(异步IO)

发起请求立刻得到回复,不用挂起等待; 数据会由内核进程主动完成拷贝

同步异步、阻塞非阻塞

同步异步阻塞非阻塞都是在io操作时才有的概念

同步:
指代码调用io操作时,必须等待io操作完成才返回的调用方式

异步
异步是指代码调用io操作时,不必等待io操作完成就返回调用方式
我们的多线程,就是典型的异步调用方式

阻塞
指调用函数时候,当前线程被挂起,就是线程被暂停,cpu去执行其他线程

非阻塞
指调用函数时候,当前线程不会被挂起,而是立即返回

同步和异步是消息通讯的机制
阻塞和非阻塞是函数调用机制

posted @ 2023-08-24 10:46  王寄鱼  阅读(5)  评论(0编辑  收藏  举报