八股文之计算机网络


1,什么是tcp与ucp,它们的区别?

tcp是传输控制协议,是面向连接的协议,发送数据前需要先在发送方和接收方之间建立连接,tcp提供可靠的服务,传输的数据无差错、不重复、不丢失、且按序到达。

udp是用户数据报文协议,是面向无连接的协议,发送数据前不需要建立连接,是不可靠的协议。不能保证传输数据是否到达目的地,到达时间以及数据正确性。

tcp面向字节流,udp面向数据报文。面向字节流指的是发送数据以字节为单位,一个数据包可以拆分成若干分组进行发送,而udp一个报文只能一次发完。

tcp支持点对点通信,udp支持一对一,一对多,多对多

tcp报文首部20个字节,udp报文首部8个字节

tcp有拥塞控制机制,udp没有

对于实时性要求高的情况使用udp,如游戏、直播、媒体通信;其他大部分情况使用的都是tcp,如http,要求传输的内容可靠,不出现丢包。

2,tcp首部?

tcp首部承载tcp协议需要的各项信息。

tcp端口号:源ip,源port + 目的ip,目的port(各占16字节,端口范围1024~65535)

tcp序列号和确认号:

32位序列号seq:tcp通信过程中某一个传输方向上字节流的每个字节的序号,用过它来确认发送数据的有序。

32位确认号ack:tcp对上一次的seq做出的确认号,用来响应tcp报文,给收到的报文段的序号seq+1。

tcp的标志位:

SYN:同步标志位,用于建立会话,同步序列号

FIN:完成标志位,用来表示关闭连接

ACK:确认标志位,用于对接受的数据包进行确认

PSH\RST\URG

3,什么是三次握手?

三次握手指的是建立一个tcp连接,客户端和服务端总计需要发送三个报文。

三次握手的目的是连接服务器指定端口,建立tcp连接,并同步序列号和确认号,交换tcp窗口大小信息。

首先客户端和服务端都处于listen状态

第一次握手:

客户端将tcp报文标志位SYN置为1,随机生成一个序列号seq=j,保存在tcp的报文首部序列号字段里,指明客户端想要连接的服务器端口,并将该数据包发送给服务端,发送完毕后进入SYN_SEND状态,等待服务器确认。

第二次握手:

服务端收到数据包后根据标志位SYN=1知道客户端请求建立连接,服务端将SYN和ACK都置为1,ack=j+1,随机产生一个序列号seq=k,并将该数据包发送给客户端以确认连接请求,服务器进入SYN_RCVD状态。

第三次握手:

客户端收到确认后,检查是否ack=j+1,ACK=1,如果正确将标志位ACK置为1,ack=k+1,,并将该数据包发送给服务端,服务端检查ack=k+1,ACK=1,如果正确则连接建立成功,服务端和客户端进入ESTABLISHED状态,完成三次握手,就此服务端和客户端可以进行数据传输。

4,为什么需要三次握手?

假设客户端发出的请求没有丢失,而是在某个网络节点长期滞留了,以至于延误到链接释放后的某个时间才到达服务端。

服务端收到实效的连接请求报文后,误以为是客户端新建立的连接请求,于是向客户端发送确认报文段,同意建立连接。

假设不采用三次握手,那么只要服务端发送请求确认报文连接就会建立。但是客户端现在并没有发送建立连接的请求,因此也不会理睬服务端的确认,也不会像服务端发送数据。但服务端以为连接已经建立,并一直等待客户端发送过来的数据,这样服务端的很多资源就被浪费了。

所以,采用三次握手可以防止上述现象发生。客户端不向服务端发送确认报文,服务端收不到确认,就不会建立连接。

5,什么是四次挥手?

四次挥手即终止tcp连接,是指断开一个tcp连接时,客户端和服务端需要发送4个包确认连接的断开。这一过程可以由客户端或服务端任意一方触发。由于tcp是全双工的,因此每个方向的连接都需要单独关闭,这一原则是一方完成数据发送任务后,发送FIN来终止这一方的连接,收到一个FIN意味着这一方没有数据流动了,但是仍能够发送数据,直到之一方也发送FIN。

假设client先发起关闭请求

第一次挥手:

client发起挥手请求,向server发送标志位是FIN的报文段,设置序列号seq,此时,client进入FIN_WAIT_1状态,表示client没有数据发送给server了。

第二次挥手:

server收到client发送的FIN报文段,向client返回一个标志位是ACK的报文段,ack设置为seq+1,client进入FIN_WAIT_2,server告诉client同意你的关闭请求,进入CLOSE_WAIT状态。

第三次挥手:

server向client发送标志位是FIN的报文段,请求关闭连接,同时server进入LAST_ACK状态。

第四次挥手:

client收到server发送的FIN报文段,向server发送标志位是ACK的报文段,然后进入TIME_WAIT状态。server收到client发送的ACK报文段后,关闭连接。此时,client等待2MSL时间后没收到回复,则证明server已正常关闭,client也关闭连接。

6,为什么要等待2MSL?

MSL报文在网络中最大生存时间。

第一:保证tcp协议的全双工连接能可靠关闭。

假如server没有收到client的ACK报文,那么server就会超时后重新发送FIN,如果此时client已经处于CLOSED状态,那么重发的FIN就找不到连接了,从而导致连接错乱。所以client发送完ACK要进入TIME_WAIT状态,当再次收到FIN能够应答ACK,保证server正常关闭。

第二:保证此次连接的重复数据端从网络中消失。

如果client发送完最后的ACK直接进入CLOSED状态,然后又向server发送了一个新连接,这时无法保证新连接与刚关闭的端口号是不同的,如果前一次连接的某些数据滞留在网络中,这些延迟数据在建立连接后到达client端,由于新连接和就连接的ip和port都一样,tcp协议就认为延迟数据是属于新连接的,新连接就会收到脏数据,导致数据包错乱。所以要等待2MSL,才能保证此次连接的所有数据在网络中消失。

7,什么是流量控制?

流量控制就是根据接收端实际的接收能力控制发送端发送数据的速率。

tcp协议的头部中包含一个16位的窗口大小,窗口大小指的是接收端剩余接收数据缓冲区大小,这个数字越大表示接受缓冲区剩余空间越大,网络吞吐量越大。

当接收端缓冲区剩余空间不足时,就会控制滑动窗口设置一个更小的值,告诉发送方减小发送的数据量。

实际的过程就是,tcp通过滑动窗口进行流量控制,滑动窗口的大小通过tcp首部的窗口大小字段告知对方。

8,什么是拥塞控制?

拥塞:就是网络中某时间段内对资源的请求超出了资源的可用部分,导致网络性能的急剧下降。通俗讲就是发送的数据包太多网络中的设备处理不过来,导致网络性能的下降。

原理:如果通信一开始就发送大量数据包,可能会导致网络瘫痪。拥塞控制中,发送方维护一个叫拥塞窗口的状态变量,拥塞窗口的大小取决于网络拥堵程度,动态变化。拥塞控制采用两个算法:慢启动和拥塞避免算法。慢启动指的是一开始不发送大量数据,先试探网络的拥堵程度,然后逐渐增大cwnd,每个传输轮次cwnd加倍。cwnd不可能以指数一直增长下去,一定时间后,换成拥塞避免算法控制窗口大小。拥塞避免采用线性增长。慢启动和拥塞避免如何配合使用呢?引入慢启动门限ss thresh控制cwnd的增长,当cwnd>ssthresh,改用拥塞避免算法。怎么设置ssthresh呢?当发现网路出现拥塞,就将ssthresh设置为cwnd的一半。

9,OSI七层协议?

1 . 物理层:功能:实现比特流的透明传输;所有协议:ISO02110,IEEE802,IEEE802.2

2 . ?数据链路层:功能:封装成帧、透明传输、差错控制以及可靠传输;所用协议:SLIP,ARP,PPP等

?3 . 网络层:功能:为数据包选择路由;所用协议:IP,ICMP,RIP等

4 . 传输层:功能:提供端对端接口;所用协议:TCP,UDP

5 . 会话层:功能:解除或建立与别的接点的联系;无协议

6 . ? 表示层:功能:数据格式化,代码转换,数据加密;无协议

7 . 应用层:功能:文件传输,电子邮件,文件服务,虚拟终端;所用协议:HTTP,FTP等