TCP/UDP区别

五层体系结构看IP地址与MAC地址

 

OSI常见五层协议:

应用层:DNSFTPHTTPSMTP 【不同服务器依据端口区分服务,比如HTTP端口为80,HTTPS为443,FTP有20和23】  ;   应用层报文

传输层:TCP, UDP  ; 运输层首部+应用层报文

网络层:IPDDPDHCP(DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围),ARP(ARP地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议)  ;     网络层首部(ip地址)+运输层首部+应用层报文

数据链路层:PPP IEEE   ; 链路层首部+网络层首部+运输层首部+应用层报文+链路层尾部

物理层:;比特流

 

TCP三次握手四次挥手:

为什么要三次握手

  如果没有三次握手,那么只要server发出确认,新的连接就简历了。比如client在发出请求时遇到故障,如果后面故障恢复,请求发送至服务器,server就以为是client发的一个新请求,于是向client发送确认报文段,同意建立连接。但是由于client没有发出请求,不会理睬server的确认,也不会向server发送数据,但是server却以为新的运输已经建立,一直等待client发来的数据,这样server的很多资源都白白浪费了。有三次握手就能防止server端一直等待,浪费资源。

第一次握手:客户端给服务器发送一个syn报文【服务器端确认客户端的发送能力正常】,并指明客户端的初始化序列号ISN(c),此时客户端处于SYN_Send状态。

第二次握手:服务器收到SYN报文后,会应答一个SYN+ACK报文给客户端【客户端确认服务器接收、发送能力正常】,并指定自己的初始化序列ISN(s),并且会把客户端的ISN(c)+1 作为ACK值,发送给客户端, 此时服务端的状态为 SYN_REVD状态

第三次握手:客户端收到SYN+ACK报文后,会应答一个ACK报文,ACK=ISN(s)+1,此时客户端的状态为established

服务端收到ACK报文后,三次握手建立完成。【服务端确认客户端的接受能力正常,所以只有通过三次握手才能确立双方的接受、发送能力都是正常的】

  ACK是期望对方继续发送的那个数据包的序列号, seq是数据包本身的序列号

 

【扩展问题】

初始化序列号ISN是固定的吗?

不是,如果ISN是固定的,则攻击者很容易猜出后续的确认号,所以ISN是动态生成的。

三次握手可以携带数据吗?

第一二次握手不可以用,如果第一次可以携带数据的话,如果恶意攻击服务器,在第一次握手中的SYN报文中放入大量数据,攻击者疯狂发送SYN报文,会让服务器浪费很多的空间、时间来接受这些报文。 而对于第三次,此时客户端已经处于established状态了,也就是说,对于客户端来说,已经建立起连接了,并且也知道服务器的接受,发送能力正常,可以携带数据。

 

为什么需要四次挥手:

第一次挥手:客户端发送一个FIN报文,报文中会指定一个序列号,此时客户端处于FIN_WAIT1状态
第二次挥手:服务端收到FIN报文后,会发送ACK报文,并且把客户端的序列号值+1作为ACK报文的序列号,表明收到了客户端的报文,此时服务端处于CLOSE_WAIT状态

第三次挥手:如果服务端也想断开连接了,会发送一个FIN报文并且指定一个序列号,此时服务端处于LAST_ACK状态

第四次挥手:客户端收到FIN后,发送一个ACK报文作为应答,服务器的序列号+1作为自己ACK报文的序列号,此时客户端处于TIME_WAIT状态,需要过一阵子以确保服务端收到自己的ACK报文后才会进入CLOSED状态;

服务器端收到ACK报文后,就关闭连接,处于CLOSED状态了。

 

在第四次挥手,客户端发送完ACK报文后,处于TIME_WAIT状态,为什么不直接关闭,而要确保服务端收到ACK报文才关闭连接。因为如果这里服务器端未收到我们的ACK,服务器端会重发FIN报文给客户端,客户端再次收到ACK报文后,就知道之前的ACK报文丢失了,会再次发送ACK报文给服务端。

TIME_WAIT会设计一个计时(至少是一个报文来回的时间),如果过了这个计时,客户端还没有收到重发的FIN报文,就会关闭连接,处于CLOSED状态。

 

posted @ 2021-09-13 14:41  6000a  阅读(76)  评论(0)    收藏  举报