目录
静态变量 局部变量 全局变量的占内存大小、内存存储位置、作用范围、作用周期是什么
AB两个主机之间建立了一个 TCP 连接,A主机发给B主机两个 TCP 报文,大小分别是500和 300,第一个报文的序列号是 200,那么 B 主机接收两个报文后,返回的确认号是多少?
收到IP 数据包解析以后,它怎么知道这个分组应该投递到上层的哪一个协议 (UDP或TCP) ?
TCP 提供了一种字节流服务,而收发双方都不保持记录的边界,应用程序应该如何提供他们自己的记录标识呢?
TCP网络分层
分层的好处:
为什么SYN和FIN不包含数据,却要消耗一个序列号?
凡是对端确认的,一定要消耗TCP报文的序列号,SYN和FIN需要对端的确认所以需要消耗一个序列号,防止发送重复并使调用具有顺序性。
为什么TCP握手是三次?
简单来说就是,第一次握手保证了客户端的发送是没有问题的。第二次握手表示服务端的接收和发送是没有问题的。第三次握手表示客户端的接收是没有问题的。比如在实际的场景下,我如果只进行两次握手,客户端向服务端发送一个SYN包来建立连接,但因为某些未知的原因并没有到达服务器,在中间某个网络节点产生了滞留,那为了建立连接,客户端会重发送包,这次的数据包正常送达,服务端回复syn+ack之后建立起了连接,但是第一包数据阻塞的网络节点突然回复,第一包SYN包又送达到服务端,这时服务端会误认为是客户端,又发起了一个新的连接,服务端认为是两个连接,而客户端认为是一个连接,会造成了状态不一致。
为什么TCP挥手是四次?
客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。
为什么客户端在TIME-WAIT阶段要等2MSL?
为的是确认服务器端是否收到客户端发出的 ACK 确认报文,当客户端发出最后的 ACK 确认报文时,并不能确定服务器端能够收到该段报文。
TCP与UDP的区别?
基于连接与非连接。他们就像人与人之间写信沟通与电话沟通的区别,UDP就像写信,信息出去之后,对方是否能收到,收到的信息内容是否完整。如果先后寄两封信过去,是否按照顺序接收,都是未知数,甚至我填写的收信地址和收信人是否存在,我都无法确认。TCP就像打电话,从拨打电话到对方接通互相通话,再到结束通话后挂断,这一系列的流程都能得到及时的反馈,并且能确认对方准确地接收到
ARP
知道目标设备的IP地址,查询目标设备的MAC地址
听说过TFO吗?
TFO是在TCP协议上的扩展协议,当客户端与服务器已经成功建立过正常的TCP三次握手后,那么再次发送SYN请求建立连接的报文时就同时会传输数据了,它的显著优势是相比常规三次握手节省一个RTT的往返时间
tcp的时间戳主要解决了2个问题
计算往返时延RTT 防止序列号回绕问题 计算往返时延
超时重传时间 RTO 怎么计算?
可以取两次往返时延RTT的平均值,比较经典的算法就是平滑往返时间,引入一个平滑因子来去计算。
wifi通信与TCP/IP通信的区别?
socket相关
网络的数据传输是使用队列的
因为我们上层很多对网络的一些操作不是直接发送的,在这一点上,我们网络设备驱动有点像块设备驱动。
字符设备驱动是应用传一包数据过来,驱动立马就处理一包,中间没有任何缓冲。
块设备就有个队列,应用去发一包数据,我们就给队列里面添加一个请求,这里面有很多请求,然后有我们的第三方的一个调度层,使用电梯算法从队列里面把那些请求拿出来,再进行一个排序和合并。然后再去决定先处理谁后处理谁。
网络设备驱动也类似,也有一个队列,应用层传过来的东西先丢到队列里,然后驱动层再从队列里拿出来处理。
DM9000的内存映射:
分为两部分,一部分呢,因为DM9000它是通过一个内存back映射的方式,映射到我们的主CPU的一个地址空间里面去的,所以我拿一个地址空间的物理地址再去映射得到一个虚拟地址就可以操作了request_mem_region就是在申请物理地址,然后你得到允许之后就通过ioremap去映射对应的虚拟地址。
算法:
用sizeof怎么看主机是16位还是32位
sizeof(int)
会不会递归?递归的必要条件是什么
有一个递归的停止条件,防止递归无限循环。
静态变量 局部变量 全局变量的占内存大小、内存存储位置、作用范围、作用周期是什么
new是从哪里分配内存
在堆上动态分配内存。堆是程序运行时可用于动态分配和释放内存的区域。
返回指向该内存的指针。
HTTP的几种请求方法具体介绍
- GET 获取资源,没有body,幂等性
- POST 增加或者修改资源,有body
- PUT 修改资源,有body,幂等性
- DELETE 删除资源,幂等性
TCP、HTTP\HTTPS等的端口号:
TCP用两字节的整数来表示端口,一台主机最大允许65536个端口号的
HTTP请求和响应报文的格式,以及常用状态码。
1)请求报文:
//请求行(包括method、path、HTTP版本) GET /s HTTP/1.1 //Headers Host: www.baidu.com Content-Type: text/plain //Body 搜索****
2)响应报文
//状态行 (包括HTTP版本、状态码,状态信息) HTTP/1.1 200 OK //Headers Content-Type: application/json; charset=utf-8 //Body [{"info":"xixi"}]
3)常用状态码 主要分为五种类型:
- 1开头, 代表临时性消息,比如100(继续发送)
- 2开头, 代表请求成功,比如200(OK)
- 3开头, 代表重定向,比如304(内容无改变)
- 4开头, 代表客户端的一些错误,比如403(禁止访问)
- 5开头, 代表服务器的一些错误,比如500
什么是子网掩码,它有什么作用?
子网掩码用于划分IP地址为网络地址和主机地址。它是一个32位数字,定义了网络中哪些位用于网络地址,哪些位用于主机地址。
如何通过IP地址和子网掩码计算网络地址?
通过将IP地址与子网掩码进行逻辑“与”操作。结果是网络地址。
什么是TCP的滑动窗口?
滑动窗口是TCP用于控制发送和接收数据量的机制。它确定了在等待确认之前,可以发送多少数据段。
如何诊断网络中的延迟问题?
可以使用工具如ping
和traceroute
来诊断网络延迟。ping
可以测试到目标服务器的往返时间,而traceroute
可以显示数据包经过的每一跳的时间。
什么是负载均衡,它如何与TCP/IP相关?
负载均衡是一种技术,用于分发网络流量到多个服务器,确保每个服务器都不会过载。与TCP/IP的关系在于,负载均衡器会根据TCP/IP数据包的内容决定如何分发流量。
AB两个主机之间建立了一个 TCP 连接,A主机发给B主机两个 TCP 报文,大小分别是500和 300,第一个报文的序列号是 200,那么 B 主机接收两个报文后,返回的确认号是多少?
500+300+200=1000
收到IP 数据包解析以后,它怎么知道这个分组应该投递到上层的哪一个协议 (UDP或TCP) ?
IP报文头里有一个用八位来表示的协议,用来区分IP协议上的上层协议
TCP 提供了一种字节流服务,而收发双方都不保持记录的边界,应用程序应该如何提供他们自己的记录标识呢?
telnet的用法
检查端口是否打开
wireshark
抓包工具