10.29学习笔记

面经总结

1.计算机网络模型

  • OSI
    由下到上:
    物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化。
    数据链路层:通过各种控制协议,把有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。
    网络层:通过路由选择算法为报文或分组通过通信子网选择最佳的路径。
    传输层:向用户提供可靠的端到端的差错和流量控制,保证报文的正常传输。
    会话层:会话层的任务就是组织和协调两个会话进程之间的通信,并对数据交换进行管理。
    表示层:处理用户信息的表示问题,如编码、数据格式转换和加密解密。
    应用层:计算机用户以及各种程序和网络之间的接口。
  • TCP/IP模型
    网络接口层网络层传输层应用层

2.TCP三次挥手和四次挥手

2.1三次握手

2.1.1 三次握手详述

首先客户端发送连接请求报文,服务器端接受连接后回复ACK报文,并为这次连接分配资源。客户端接收到ACK报文后也向服务器端发送ACK报文,并分配资源,这样TCP连接就建立了。
在这里插入图片描述
最初两端的TCP进程都处于CLOSED关闭状态,客户端主动打开连接,而服务器端被动打开连接;
建立过程中的状态变化:
(客户端和服务器端关闭状态CLOSED——服务器端收听状态LISTEN——客户端同步已发送状态SYN-SENT——服务器端同步收到状态SYN-RCVD——客户端和服务器端已建立状态ESTABLISHED)

  • 服务器端的TCP服务器进程先创建传输控制块TCB(Thread Control Block,线程控制块),准备接受客户进程的连接请求。然后服务器就处于LISTEN(收听)状态,等待客户的连接请求。若有,则作出响应。
  • 第一次握手:客户端的TCP客户进程也是首先创建控制块TCB,然后向服务器端发出连接请求报文段,(首部的同步位SYN=1,初始序号seq=x),(SYN=1的报文段不能携带数据)但要消耗掉一个序号,此时TCP客户进程进入SYN_SENT(同步已发送)状态。
  • 第二次握手:服务器端收到连接请求报文后,如同意建立连接,则向客户端发送确认,在确认报文段中(SYN=1,ACK=1,确认ack=x+1,seq=y),此时TCP服务器进程进入SYN_RCVD(同步收到)状态;
  • 第三次握手:TCP客户端进程收到服务器端的确认后,要向服务器端给出确认报文段(ACK=1,确认号ack=y+1,序号seq=x+1)(初始为seq=x,第二个报文段要加一),ACK报文段可以携带数据,不携带数据则不消耗序号。TCP连接已经建立,客户端进入ESTABLISHED(已建立连接)。
  • 当服务器端收到客户端的确认后,也进入ESTABLISHED状态。

2.1.2 总结三次握手过程

  • 第一次握手:起初两端都处于CLOSED关闭状态,客户端将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发给服务器端,客户端进入SYN_SENT状态,等待服务器端确认;
  • 第二次握手:服务器端收到数据包后由标志位SYN=1得知客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=x+1,随机生成一个值seq=y,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态,此时操作系统为该TCP连接分配TCP缓存和变量;
  • 第三次握手:客户端收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并且此时操作系统为该TCP连接分配TCP缓存和变量,并将该数据包发送给服务器端,服务器端检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端和服务器端就可以开始传输数据。
    起初客户端和服务器端都处于CLOSED状态——服务器端创建TCB,处于LISTEN状态,等待客户端请求——客户端创建TCB,发送连接请求(SYN=1,seq=x),进入SYN_SENT状态——服务器端收到连接请求,向客户端发送确认(SYN=ACK=1,确认号ack=x+1,初始序号seq=y),进入SYN_RCVD状态——客户端收到服务器端的确认后,给服务器端发出确认(ACK=1,ack=y+1,seq=x+1),客户端进入ESTABLISHED状态——服务器端收到客户端的确认后,进入ESTABLISHED状态。

2.1.3 为什么要三次握手而不是二次握手?

为了防止已失效的连接请求报文段突然又传送到服务器端,引发错误。比如客户端发出了连接请求,但因为请求连接报文丢失而未收到确认,于是客户端在重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接。
客户端总共发了两个连接请求报文段,其中第一个丢失,第二个到达了服务器端,但是第一个丢失的报文段只是在某些网络节点长时间滞留了,延误到连接释放以后的某个时间才到达服务器端,此时服务器端认为客户端又发出了一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接。
如果不采用三次握手,只要服务器端发出确认,就建立新的连接了。由于现在客户端并没有发出建立连接的请求,因此不会理睬服务器端的确认,也不会向服务器端发送数据。但服务器端却以为新的运输连接已经建立,会一直等待客户端发送数据,这样服务器端的很多资源就浪费了。
此时如果采用三次握手的话,客户端不会向服务器端发出确认,服务器端由于收不到确认,就知道客户端并没有要求建立连接。

2.1.4服务器端容易受到SYN攻击?

服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击,SYN攻击就是客户端在短时间内伪造大量不存在的IP地址,并向服务器端不断地发送SYN包,服务器端则回应确认包,并等待客户端确认,由于源地址不存在,因此服务器端需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。
防范SYN攻击措施:降低服务器的等待时间使服务器尽快地释放半连接的占用(在三次握手过程中,服务器发送SYN-ACK后,收到客户端的ACK之前的TCP连接成为半连接),短时间收到某IP的重复SYN则丢弃后续请求。

2.2四次挥手

2.2.1四次挥手的详述
  • 假设客户端发起中断连接请求,也就是发送FIN报文。服务器端接收到到FIN报文,意味着客户端没有数据要发送了,但是如果服务器端还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据,服务器先发送ACK,意味着服务器端还有数据需要发送。这时候客户端进入FIN_WAIT状态,继续等待服务器端的FIN报文。
  • 当服务器端确定数据发送完成,则向客户端发送FIN报文。告诉客户端这边数据发送完成了,准备好关闭连接了。
  • 客户端收到FIN报文后,就知道可以关闭连接了,但是怕服务器端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果服务器端没有收到ACK则可以重传。
  • 服务器端收到ACK后,知道可以断开连接了。客户端等待了2MSL(Maximum Segment Lifetime)(最大报文生存时间,任何报文在网络上生存的最大时间,超过这个时间报文将被丢弃)后依然没有收到回复,证明服务器端已正常关闭,然后客户端也关闭连接。TCP连接关闭完成。
    在这里插入图片描述
    数据传输结束后,通信双方都可以释放连接,客户端和服务器端都处于ESTABLISHED状态。(客户端和服务器端建立连接状态ESTABLISHED——客户端)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值