计算机网络面试题(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzc2608/article/details/82145925

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渲染。

猜你喜欢

转载自blog.csdn.net/wzc2608/article/details/82145925