计算机网络面试题(一)

本文详细介绍了计算机网络面试中的重点,包括TCP建立连接的三次握手、路由协议(RIP和OSPF)、TCP与UDP的区别、端口号分配、HTTP请求报文首部、网页解析流程、IP分片的原因与实现、TCP的四次挥手和超时重传机制,以及TCP如何确保数据传输的可靠性,涵盖了从连接建立到数据传输的各个环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:建立TCP的各个系统调用

系统调用

上图给出了TCP服务器和客户端所需要的系统调用

TCP调用各层 来自IBM

上图中从上到下各层分别为TCP应用->套接字层->协议层->接口层->物理层
其中套接字层负责接收任何TCP的系统调用,验证上层传递参数的正确性
协议层负责对协议的实现(TCP),接收上层调用,两个层之间共享的数据结构具有独占访问权限,避免任何数据结构损坏。
接口层运行网络设备驱动程序,该层从物理层接收数据,并向物理层传输数据
每个套接字具有一个套接字队列,并且每个接口具有一个用于数据通信的接口队列。不过,对于整个协议层,只有一个称为 IP 输入队列的协议队列。接口层通过此 IP 输入队列将数据输入到协议层。协议层使用相应的接口队列将数据输出到接口。

来自Shining-LY

**socket网络编程中的系统调用:**这与建立TCP所需的系统调用相同,请参考socket网络编程
除了连接所指的系统调用外,还有以下调用:

shutdown (struct proc *p, struct shutdown_args *uap, int *retval);
Struct shutdown_args
{
    int s;
    int how;
}

在 shutdown 系统调用中:
s 是套接字描述符。
how 指定将关闭哪一部分连接。how 的值 0、1 和 2 分别指定关闭连接的读取部分、写入部分和同时关闭连接的读取及写入部分。
shutdown 系统调用关闭连接的任意一端或两端。如果需要关闭读取部分,则会丢弃接收缓冲区中存在的任何数据,并关闭该端的连接。对写入部分,TCP 发送任何剩余的数据,然后终止连接的写入端。可以看出shutdown函数对四次挥手的过程做了拆分。

soo_close(struct file *fp , struct proc *p);

close 系统调用可关闭或中止套接字上任何挂起的连接。

在套接字中存在一个引用计数,计数方式是父进程加子进程的和。
close函数会去查引用计数,如果为0,执行TCP的四次挥手过程,如果大于0,则减一。
调用之后,TCP连接已经断开,这个时候其上调用write或者read函数则会产生错误码为9即EBADF的错误。
调用close时,如果协议栈中还存在等候发送的数据,则受俩个参数的控制,如下表
这里写图片描述
close与shutdown的区别:
1、是否触发四次挥手
close:只是减少套接字描述符的计数,如果计数为0,则触发四次挥手。
shutdown:拆分四次挥手过程,在设置howto参数为SHUT_WR或者SHUT_RDWR时,会立即发送FIN。
2、多进程共享描述符
close:只要描述符计数不为0,没有调用过该函数的进程仍然可以正常收发数据。
shutdown:无论描述符计数是多少,只要任一进程调用该函数都会破坏所有进程的连接,任一进程在该描述符上读取数据都会收到EOF结束符,写数据时会收到SIGPIPE信号。
3.一般来说,调用close前,会调用shutdown关闭输出数据的通道。
半关闭状态及其原因:
套接字中交换数据的状态可以看做是一种流,在套接字的流中,数据只能向一个方向流动,因此,想要实现全双工,就必须有俩个流,一个输入流,一个输出流;所谓半关闭状态,就是关闭了其中一个方向的流。
使用shutdown函数可以造成半关闭状态。
断开输入流:套接字将无法接受数据,即使输入缓冲收到数据也会抹去,且无法调用输入相关函数,
断开输出流:套接字无法传输数据,但输出缓冲区还留有未传输的数据,则会将未传输数据传输给目标主机
在多进程的情况下,子进程继承了父进程的socket,引用计数加一,这个时候希望关闭socket的话,调用close实际上只是让引用计数减一,而使用shutdown则是直接发送FIN。

2:路由协议介绍

内部网关协议IGP包括RIP和OSPF
RIP(路由信息协议):
RIP是一种分布式的基于距离向量的路由选择协议
1.要求网络中每一个路由器都要维护从它自己到其他每一个目的网络的距离记录;
2.从一路由器到直接连接的网络的距离定义为1,距离也称为跳数;
3.RIP允许的最大跳数为15,超过15被认为不可达;
4.RIP选择最小跳数的路由
5.RIP仅和相邻的路由器交换信息,时间间隔固定,且一次交换所有信息(全部路由表)
6.网络拓扑变化时,及时告知相邻路由表
路由表更新采用距离向量算法:
路由表中的每一条记录包含三个项目:目的网络、下一跳地址、距离
步骤如下:
1.对地址为X的相邻路由器发来的RIP报文,先修改此报文中的所有项目:把“下一跳”字段中的地址都改为X,并把所有的“距离”字段的值加一
2.对修改后的RIP报文中的每一个项目,进行以下步骤:
若原来的路由表中没有目的网络N,则把该项目添加到路由表中。
否则(即在路由表中有目的网络N,这时就再查看下一跳路由器地址)
若下一跳路由器地址是X,则把收到的项目替换原路由表中的项目。
否则(即这个项目是:到目的网络N,但下一跳路由器不是X)
若收到的项目中的距离d小于路由表中的距离,则进行更新。
否则什么也不做。
3.若3分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达的路由器,即把距离置为16(表示不可达)。
该算法的缺点是:不太容易判断每个路由器的信息是否正确
OSPF:((开放式最短路径优先)
ospf是链路状态协议,RIP是距离矢量协议,距离计算采用迪杰特斯拉算法,以每一个路由器为根,计算到每一个目的路由器的距离。
迪杰特斯拉算法: 求单源最短路径,本质上是每次寻找离源点最近的节点,加入结果集中,直到所有点都求出到源点的最短路径。
外部网关协议EGP和BGP
自治系统: 一个自治系统是指有权决定在本系统内使用何种路由协议的小型单位
EGP: 不同的自自治系统间交换路由信息的协议,EGP具有以下三个功能:
1.支持邻站获取机制
2.可持续测试其邻站是否有响应
3.周期性的传送路由更新报文来交换网络可达信息
BGP是一种EGP协议: BGP(Border Gateway Protocol),边界网关协议是连接不同组织机构(或者说连接不同自治系统)的一种协议。BGP用于在不同的自治系统(AS)之间交换路由信息。当两个AS需要交换路由信息时,每个AS都必须指定一个运行BGP的节点,来代表AS与其他的AS交换路由信息。这个节点可以是一个主机。但通常是路由器来执行BGP。两个AS中利用BGP交换信息的路由器也被称为边界网关(Border Gateway)或边界路由器(Border Router)

3.TCP和UDP的区别

1.TCP基于连接,稳定可靠,但是速度慢效率低,占用资源高;udp无连接,速度快,不可靠,不稳定。
2.TCP面向字节流,UDP面向报文
3.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
4.TCP的逻辑通信信道是全双工的可靠信道,UDP则是(全双工)不可靠信道

4.TCP与UDP相关的协议与端口号

TCP:
FTP:定义了文件传输协议,使用21端口
Telnet:它是一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上
SMTP:定义了简单邮件传送协议,现在很多邮件服务器都用的是这个协议,开放的是25号端口。
POP3:它是和SMTP对应,POP3用于接收邮件。通常情况下,POP3协议所用的是110端口
UDP:
HTTP:这是大家用得最多的协议,它就是常说的"超文本传输协议",80号端口
DNS:用于域名解析服务,53号端口
SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。

5.TCP/UDP/IP/HTTP请求报文的首部

TCP/UDP/IP: 首部
http请求报文首部: HTTP请求报文由方法,URL,HTTP版本和首部字段组成,前三部分组成请求行,首部字段则负责传递额外的重要信息,给给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容;首部字段有四种类型,通用首部字段、请求首部字段、相应首部字段、实体首部字段。首部字段的格式如下:

首部字段名: 字段值

HTTP请求首部

6.网页解析的过程与实现方法

(浏览器输入URL后执行的全过程)
应用层: 通过DNS对域名进行解析,过程如下:
先查浏览器缓存,查系统缓存,查路由器缓存、查ISP缓存、没有就按照DNS服务器的搜索逻辑从根域名服务器开始递归搜索,最终得到一个IP地址,此时客户端浏览器发起一个http会话,转交运输层
运输层: 建立TCP连接,传数据
网络层: 查路由表,转发IP数据报
数据链路层: 使用ARP协议找到MAC地址转发,数据帧
回复:
浏览器向WEB服务器发送了一个Http请求,服务器返回相应数据给客户端,浏览器拿到响应数据后开始解析:
1.解析html文档,边解析边显示
2.遇到引用外部css文件或者图片,浏览器发送请求给服务器,拿到对应的css文件和图片资源,这个请求不会影响html的加载
3.碰到js时,则等待直到js加载和解析完毕,才恢复html渲染。

7.网络层分片的原因与具体实现(IP分片)

定义:IP协议在传输数据包时,将报文分成若干片进行传输,并在目标系统中重组
原因:数据链路层具有最大传输单元MTU的特性,它限制数据帧的最大长度,当要传输的IP报文超过MTU时,就分片
实现:IP首部包含了分片和重组所需要的信息
| Identification |R|DF|MF| Fragment Offset |
ldentification:IP包的id号,每一个IP包的唯一标识,在分片中相同
R:无用
DF:该位置1,IP层不对数据分片
MF:除最后一片外,其它片该位都置1,表示后面还有
Fragment Offset(13位):该片偏移原始数据包开始处的位置。偏移的字节数是该值乘以8.
数据报被分片后,每个片的总长度值要改为该片的长度值

8.TCP的三次握手与四次挥手

三次握手:
三次握手
1.TCP服务器先创建传输控制块TCB,准备接受请求,进入listen状态
2.TCP客户端也创建传输控制块TCB,发送连接请求报文,首部的SYN = 1,选择初始序列号seq=x,此时客户端进入SYN-SENT状态,SYN报文没有数据但使用一个序号
3.服务器收到SYN报文后,发送确认报文,首部ACK=1,SYN=1,确认号ack = x + 1,为自己初始化序列seq=y,服务器进入SYN-RCVD,该报文无数据但同样消耗序号
4.客户端收到确认后,再给出确认,首部ACK=1,ack=y+1,自己的序列号seq=x+1,客户端进入ESTABLISHED状态,该报文可携带数据,不携带则不消耗序号
5.服务器收到确认后,进入ESTABLISHED状态。
俩次握手可以嘛?
不可以,如果网络中存在失效的连接请求报文,在链接建立之后到达了服务器,如果俩次握手或直接建立一条链接,但这条链接是不必要的;但如果是三次握手的话,第二次握手的报文到达客户端时,客户端不会发出确认,服务器也收不到确认;这时就知道并没有请求链接
四次挥手:
四次挥手
1.客户端发送连接释放报文,且停止发送数据,首部FIN=1,序号seq=u,此时客户端进入FIN-WAIT-1状态,该报文消耗一个序号
2.服务器发送确认报文,首部ACK=1,ack=u+1,以及自己的序列号seq=v,此时服务器端进入CLOSE-WAIT状态,这个时候客户端向服务器方向释放,即进入半关闭状态
3.客户端收到请求后进入FIN-WAIT-2状态,接受可能的服务器发送的数据,等待服务器发送连接释放报文
4.服务器发送连接释放报文,首部FIN=1,ack=u+1,自己的序列号seq=w,服务器进入LAST-ACK状态。
5.客户端发送确认报文,首部ACK=1,ack=w+1,自己的序列号seq=u+1,客户端进入TIME-WAIT状态,此时还未释放,经过2MSL(TIME-WAIT)后,客户端撤销相应的TCB进入CLOSED状态
6.服务器只要收到确认,立即进入CLOSED状态
为什么要等2MSL
1.保证最后一个ACK能到达服务器,如果服务器没有收到客户端的确认报文,它会重新进行第三次挥手,这样客户端在2MSL内能收到重发的报文,并给出回应,重置2MSL计时器
2.这个时间可以时所有网络中的报文到达应该到的位置,新的连接中不会出现旧的连接的报文
已经建立连接,客户端突然故障怎么办
TCP有一个保活计时器,每一次收到客户端请求该计时器重置,如果计时时间到(俩小时),没有收到客户端请求,服务器会每隔75分钟发送探测报文,连发10个仍然没有反应,就关闭连接

9.TCP的超时重传机制

超时重传指的是,发送数据包在一定的时间周期内没有收到相应的ACK,等待一定的时间,超时之后就认为这个数据包丢失,就会重新发送。这个等待时间被称为RTO。
1.被发送的片段放在一个窗口中,没有确认不会被移走,在定时器到期前,每个片段的位置不变
2.只有收到确认后,相应的片段才会移走
3.定时器到期都没有收到确认,就重传
快重传机制:
不等定时器到时,如果连续收到3次重复 ACK就认为这个包丢失,立即重传

10.TCP怎么保证可靠性

1.校验和,发送方和接受方用同样的算法计算校验和,对比如果不一致则一定有误,一致则可能有误
2.应答机制:TCp传输对每个字节的数据编号,当接收方收到数据后,会发送ACK报文,这个报文中带有的序列号告诉发送方接受了那些数据,下一次从哪里发
3.超时重传
4.连接管理,三次握手四次挥手
5.流量控制,接受方返回ACK时,会把自己剩余缓冲区的大小填补进窗口字段中,发送方根据ACK报文里窗口值的大小改变自己的发送速度,如果为0,停止发送,并定期发送窗口探测数据段,得到接受方的窗口大小
6.拥塞控制,慢启动机制,刚开始拥塞窗口为1,每次收到ACK应答拥塞窗口翻倍,发送数据前首先把拥塞 窗口与接受端反馈的窗口大小对比,选择较小的作为实际发送的窗口;设置一个拥塞窗口的阈值,当大小超过阈值时,由指数增长变为线性增长;在一开始,这个阈值时窗口的最大值,一旦发生超时重传,慢启动的阈值设置为原来的一半,同时拥塞窗口置为1;
7.面向字节流,TCP不插入任何记录标识符也不做任何解释

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值