面试集锦(五)计算机网络

计算机网络

https://blog.csdn.net/weixin_46124214/article/details/105859504

https://blog.csdn.net/justloveyou_/article/details/78303617

1. TCP/IP网络模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wofIHRwe-1602775782384)(C:\Users\vocyd\AppData\Roaming\Typora\typora-user-images\image-20200908092959013.png)]

  • TCP/IP协议通信的过程其实就对应着数据入栈与出栈的过程。入栈的过程,数据发送方每层不断地封装首部与尾部,添加一些传输的信息,确保能传输到目的地。出栈的过程,数据接收方每层不断地拆除首部与尾部,得到最终传输的数据。

2. 三次握手和四次挥手

  • 建立连接 三次握手

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sLOhX50v-1602775782387)(C:\Users\vocyd\AppData\Roaming\Typora\typora-user-images\image-20200908094008680.png)]

最初两端的TCP进程都处于CLOSED状态。client是主动打开连接,server是被动打开连接。

  • 首先client的TCP客户进程向server发出连接请求报文段,这时首部中的同步位SYN=1,初始序号seq=x。这时,client的客户进程就进入SYN-SENT(同步已发送)状态。
  • server收到连接请求报文段后,向client发送确认。在确认报文段中把SYN和ACK位都置为1,确认号是ack=x+1,初始序号seq=y。这时server的TCP服务器进程就进入SYN-RCVD(同步已收到)状态。
  • client的TCP客户进程收到server的确认后,还要向server给出确认。确认报文段的ACK置为1,确认号ack=y+1,序号seq=x+1。这时,TCP连接已经建立,client进入ESTABLISHED(已建立连接)状态,当server收到client的确认后,也会进入ESTABLISHED状态。

以上给出的连接建立过程就是常说的TCP三次握手。

客户端:老弟我要跟你链接

服务端:好的,同意了

客户端:好嘞


为什么要三次握手?(为什么client还要发送一次确认呢?)

三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。而第三次握手主要是为了防止已失效的连接请求报文段突然又传送到了server,因而产生错误。

假定client发出的某一个连接请求报文段在传输的过程中并没有丢失,而是在某个网络节点长时间滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误以为client又发了一次新的连接请求,于是向client发出确认报文段,同意建立连接。假如不采用三次握手,那么只要server发出确认,新的连接就建立了。由于client并未发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立了,并一直等待client发来数据,因此白白浪费了许多资源。

采用TCP三次握手的方法可以防止上述现象发生。例如在刚才的情况下,由于client不会向server的确认发出确认,server由于收不到确认,就知道client并没有要求建立连接。


为什么要传回SYN?

接收端传回发送端所发送的SYN是:为了告诉发送端,我接收到的信息确实就是你所发送的信号了。


传了SYN,为啥还要传ACK?

双方通信无误必须是两者互相发送信息都无误。传了SYN,证明发送方到接收方的通道没有问题,但是接收方到发送方的通道还需要ACK信号来进行验证。


  • 断开连接 四次挥手

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wLhSQVHe-1602775782389)(C:\Users\vocyd\AppData\Roaming\Typora\typora-user-images\image-20200908094758057.png)]

数据传输结束后,通信的双方都可释放连接。

  • 现在client和server都处于ESTABLISHED状态。client的应用进程先向server发出连接释放报文段,主动关闭TCP连接。client把连接释放报文段的首部的终止控制位FIN置为1,序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1。这时A进入FIN-WAIT-1(终止等待1)状态,等待server的确认。

  • server收到连接释放报文段后即发出确认(发出的不是连接释放报文段),确认号是ack=u+1,而这个报文段自己的序号是seq = v,等于server前面已传送过的数据的最后一个字节的序号加1。然后server就进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时通知高层应用进程,因而从client到server这个方向的连接释放了,这时的TCP连接处于半关闭状态,即client已经没有数据要发送了,但server若发送数据,client仍要接受。也就是说,从server到client这个方向的连接并未关闭。这个状态可以会持续一些时间。

    client收到server的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待server发出的连接释放报文段。

  • 若server已经没有要向client发送的数据,其应用进程就通知TCP释放连接。这时server发出的连接释放报文段必须使用FIN=1。现假定server的序号为w(在半关闭状态B可能又发送了一些数据)。server还必须重复上次已发送过的确认号ack=u+1。这是server就进入LAST-ACK状态,等待A的确认。

  • 在client收到server的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置为1,确认号ack=w+1,而自己的序号是seq=u+1(前面的FIN报文消耗了1个序号)。然后进入TIME-WAIT状态。请注意,现在TCP连接还没释放掉。必须再经过2MSL后,client才进入到CLOSED状态。MSL叫最长报文段寿命,一般为2分钟。

    当server收到client发出的确认,就进入CLOSED状态。由此可见server结束TCP连接的时间要比client早一些。等到2MSL结束后client也进入CLOSED状态,至此完成了TCP四次挥手断开连接全过程。

客户端:老弟,我这边没数据要传了,咱们关闭链接吧

服务端:好的,接收到了,我看看我这边还有没有要传的

服务端:我这边也没有了,关闭吧

客户端:好嘞


TCP四次挥手为什么要等待2MSL?(为什么要有TIME-WAIT这个状态呢)

MSL 是Maximum Segment Lifetime,译为“报文最大生存时间”,任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。2MSL是两倍的MSL(Maximum Segment Lifetime),2MSL就是一个发送和一个回复所需的最大时间。

  • 防止客户端最后一次发给服务器的确认在网络中丢失以至于客户端关闭,而服务端并未关闭,导致资源的浪费。

    client发送出最后的ACK回复后,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL,如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

  • 等待最大的2msl可以让本次连接的所有的网络包在链路上消失,以防造成不必要的干扰。

    如果client直接closed,然后又向server发起了一个新连接,我们不能保证这个新连接和刚关闭的连接的端口号是不同的。假设新连接和已经关闭的老端口号是一样的,如果前一次滞留的某些数据仍然在网络中,这些延迟数据会在新连接建立后到达Server,所以socket就认为那个延迟的数据是属于新连接的,数据包就会发生混淆。所以client要在TIME_WAIT状态等待2倍的MSL,这样保证本次连接的所有数据都从网络中消失。


为什么连接的时候是三次握手,关闭的时候却是四次挥手?

因为在握手过程中,当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。

四次握手因为是双方彼此都建立了连接,因此双方都要释放自己的连接,A向B发出一个释放连接请求,他要释放链接表明不再向B发送数据了,此时B收到了A发送的释放链接请求之后,给A发送一个确认,A不能再向B发送数据了,它处于FIN-WAIT-2的状态,但是此时B还可以向A进行数据的传送。此时B向A 发送一个断开连接的请求,A收到之后给B发送一个确认。此时B关闭连接。A也关闭连接。


3. TCP如何保证传输可靠性

TCP提供一种面向连接的、可靠的字节流服务。其中,面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信;而字节流服务意味着两个应用程序通过TCP链接交换8bit字节构成的字节流,TCP不在字节流中插入记录标识符。

对于可靠性,TCP通过以下方式进行保证:

  • 三次握手与四次挥手:保证可靠的连接,是保证可靠性的前提。
  • 数据包校验:发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化,接收方收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方的进行比对,若校验出包有错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据。
  • 确认应答与序列号:TCP传输时将每个字节的数据都进行了编号,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文。这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据。(对失序数据包重排序</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值