1、网络协议

1、TCP/IP

TCP/IP(Transmission Control Protocol/Internet Protocol)是一种可靠的网络数据传输控制协议。定义了主机如何连入因特网以及数据之间传输的标准。通常将该协议归类到四个抽象层中,如下图所示。
TCP:Transmission Control Protocol,传输控制协议
UDP:User Datagram Protocol,用户数据报协议
ICMP:Internet Control Message Protocol,网络控制报文协议,主要用来检测网络通信故障和实现链路追踪。如ping
IGMP:Internet Group Management Protocol,internet组管理协议
ARP:Address Resolution Protocol,地址解析协议,根据IP地址获取物理地址的一个TCP/IP协议。即将IP地址翻译为MAC地址。
RARP:Reverse Address Resolution Protoco,反向地址解析协议,允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。
在这里插入图片描述

2、三次握手

三次握手即建立TCP连接,在建立TCP连接时,需要客户端和服务端总共发送三个包已确定连接的建立。三次握手的过程如下图所示。
在这里插入图片描述
为了分析三次握手的过程,可以使用wireshark来抓包,在如下图中,当调用active接口之间,前面的三次交互过程就是三次握手的过程。分别标识为SYN、SYN,ACK、ACK,对应了上图的三个过程。
在这里插入图片描述

(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

SYN攻击:
在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
#netstat -nap | grep SYN_RECV

3、四次挥手

四次挥手即终止TCP连接。当断开一个TCP连接时,需要客户端和服务端总共发送4个包已确认连接的断开。
不过,这里涉及到一个概念。

单工:数据传输只支持数据在一个方向上传输(如:喇叭)
半双工:数据传输允许数据在两个方向上传输,但是在某一时刻,只允许在一个方向上传输,实际上有点像切换方向的单工通信(如:对讲机)
全双工:数据通信允许数据同时在两个方向上传输,因此全双工是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力(如:计算机的交互)
在这里插入图片描述
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

4、TCP通信的原理

在这里插入图片描述
在TCP中的Socket进行通信的时候,当发送端调用send方法发送数据的时候,其实数据首先是放在了介于应用层和传输层之间的缓冲区中,这个缓冲区是由内核维护的,同时,接收端在调用recv方法接收数据的时候,也是从TCP接收缓冲区中获取数据。最终来交给应用层处理。

5、滑动窗口协议

发送方和接收方都会维护一个数据帧的序列,这个序列被称作窗口。发送方的窗口大小由接收方确认,目的是控制发送速度,以免接收方的缓存不够大导致溢出,同时控制流量也可以避免网络拥塞。
下面图中的4,5,6号数据帧已经被发送出去,但是未收到关联的ACK,7,8,9帧则是等待发送。可以看出发送端的窗口大小为6,这是由接受端告知的(事实上必须考虑拥塞窗口cwnd,这里暂且考虑cwnd>rwnd)。此时如果发送端收到4号ACK,则窗口的左边缘向右收缩,窗口的右边缘则向右扩展,此时窗口就向前“滑动了”,即数据帧10也可以被发送
在这里插入图片描述

6、BIO/NIO/AIO

既然知道了TCP通信的原理,其实也就引出了一个问题,即在TCP通信的时候,会存在阻塞的情况,即当读取Socket数据的时候,如果接收缓冲区为空,则Socket的read方法的线程会阻塞,类似while循环;而对于写数据到Socket的线程来说,当发送缓冲区被占满的时候,在等待缓冲区被释放的时候,也是阻塞。这种方式即BIO(block io)。

那么为了解决BIO的问题,后来出现了NIO,NIO的原理是基于事件驱动的, NIO的最重要的地方是当一个连接创建后,不需要对应一个线程,这个连接会被注册到多路复用器上面,所以所有的连接只需要一个线程就可以搞定,当这个线程中的多路复用器进行轮询的时候,发现连接上有请求的话,才开启一个线程进行处理,也就是一个请求一个线程模式。

AIO与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。 即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。

简单理解的话,可以比作是排队买票:
1、BIO:采用窗口排队的方式,效率低下
2、NIO:排队取号的方式,只需要关注下当前的队号即可,其他时间可以做自己想做的事情,效率有提高。
3、AIO:网上购票,只需要付款后,等待商家送票上门即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值