计算机网络面经+复习

1.协议总览

五层协议的体系结构主要包括:应用层、运输层、网络层,数据链路层和物理层。

OSI七层协议模型主要包括是:应用层(Application)、表示层(Presentation)、会话层(Session)、运输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)。

计算机网络面经+复习

2.TCP/UDP

  UDP TCP
是否连接 无连接,减小开销和发送数据的延迟 面向连接,需要先握手
是否可靠

不可靠:尽最大努力交付,不需要维持复杂的连接状态表

可靠:无差错,不丢失不重复,按序到达
连接对象个数 支持一对一,多对一,一对多

只支持一对一(点对点):

通信双方能在任何时候彼此发送数据,两端都设有发送缓存和接受缓存

传输方式 面向报文 面向字节流:把应用层交付的数据看作无结构的字节流
首部开销 8字节 20字节
场景 实时应用(IP电话,视频会议,直播等) 可靠传输(文件传输)

运行在TCP的协议:

  • HTTP(Hypertext Transfer Protocol,超文本传输协议),主要用于普通浏览。
  • HTTPS(HTTP over SSL,安全超文本传输协议),HTTP协议的安全版本。
  • FTP(File Transfer Protocol,文件传输协议),用于文件传输。
  • POP3(Post Office Protocol, version 3,邮局协议),收邮件用。
  • SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),用来发送电子邮件,很多邮件服务器都是这个协议。
  • TELNET(Teletype over the Network,网络电传),通过一个终端(terminal)登陆到网络。
  • SSH(Secure Shell,用于替代安全性差的TELNET),用于加密安全登陆用。

运行在UDP的协议:

  • DNS(Dynamic Name Service,域名服务),将主机名解析成IP地址。
  • DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),动态配置IP地址。

3.1 TCP

计算机网络面经+复习

(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。

(3)保留字段:供以后使用,暂时为0

(4)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:

  • ACK:ACK=1时,确认号才有效,ACK=0时无效
  • FIN:FIN=1时,表示发送端的数据已经发送完毕,释放连接。
  • PSH(push):PSH=1时,TCP会尽快交付给应用程序而不再等到缓存填满再交付。
  • RST(reset):RST=1时,表明连接中出现严重差错,应重新连接。
  • SYN:SYN=1时,表示这是一个连接请求或连接接受报文。
  • URG:当URG=1时,紧急指针(urgent pointer)有效。

(5)允许对方发送的数据量

3.2 UDP

计算机网络面经+复习

注:伪首部

  • 计算校验和需要在UDP数据报之前增加12字节的伪首部。
  • 伪首部仅仅是为了计算校验和,不向下传送也不向上递交。
  • 这样的校验和,既检查了UDP数据报,又对IP数据报的源IP地址和目的IP地址进行了检验。
  • 伪首部供12个字节

4. TCP三次握手和四次挥手

一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。

4.1 三次握手

三次握手的本质是确认通信双方收发数据的能力

第一次握手:测试客户端的发送能力和服务端的收件能力

第二次握手:客户端发送能力和服务端的收件能力得到肯定;开始测试客户端的收件能力和服务端的发件能力

第三次握手:客户端的收件能力和服务端的发件能力得到肯定。握手成功

计算机网络面经+复习

 

第一步:客户向服务器:SYN=1(表示这是一个建立连接请求),序号seq=x(随机)

第二步:服务器向客户:SYN=1,ACK=1,seq=y(随机),ack=x+1

第三步:客户向服务器:ACK=1,seq=x+1(第一次握手时发送报文是占据一个***的,所以这次seq就从x+1开始,需要注意的是不携带数据的ACK报文是不占据***的,所以后面第一次正式发送数据时seq还是x+1),ack=y+1

4.2 四次挥手

四次挥手的目的是关闭一个连接

计算机网络面经+复习

比如客户端初始化的***ISA=100,服务端初始化的***ISA=300。TCP连接成功后客户端总共发送了1000个字节的数据,服务端在客户端发FIN报文前总共回复了2000个字节的数据。

第一步:客户向服务器:FIN=1(释放连接请求),seq=1101(100+1+1000,其中的1是建立连接时占的一个***)。需要注意的是客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个***。

第二步:服务器向客户:ACK=1(确认收到),ack=1102,seq=2300(300+2000)。此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。

第三步:服务器向客户:FIN=1,ACK=1,ack=1102,seq=2350(2300+50)。服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文

第四步:客户向服务器:ACK=1,,ack=2351,seq=1102。注意客户端发出确认报文后不是立马释放TCP连接,而是要经过2MSL(最长报文段寿命的2倍时长)后才释放TCP连接。而服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。

4.3 常见面试题

为什么TCP连接的时候是3次?4次不可以吗?

1.1 A发送 SYN + seq(X)给B

1.2 B回复 ACK + ack(X+1),记录X到本地

1.3 B发送 SYN + seq(Y)给A

1.4 A回复 ACK +seq(X+1) + ack(y+1),记录Y到本地

其中1.2和1.3可以合并为一步,四步冗余了。

为什么TCP连接的时候是3次?2次不可以吗?

1.1 A发送 SYN +seq(X)

1.2 B回复 SYN + seq(Y) + ack(X+1)

B无法知道A是否收到了,如果第二封丢失了,B认为连接已经开启,A认为没有开启并且不知道B的seq(Y)。所以需要A再给B回复确认自己已经收到。

三次握手丢包情况

第一个包丢失,B没收到:A会周期性超时重传,直到收到B的确认

第二个包丢失,A没收到:B会周期性超时重传,直到收到A的确认

第三个包丢失:A发完包会单方面认为连接建立,B却不知情

a.双方都没有数据发送:B会超时重传,直到收到A的确认

b.A有数据发送,B收到之后自动开启连接

c.B有数据发送:数据发送不了,因为B不知道是否建立连接。会一直超时重发第二个包直到收到连接建立的确认

如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP设有一个保活计时器,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。