面试常见问题之网络基础
各层协议的作用, 以及TCP/IP协议的特点
1. 五层协议
- 运用层: 为特定的程序提供数据传输服务, 比如HTTP, DNS, 数据单位为报文
- 传输层: 为进程提供通用数据传输服务. 运输层包括两种协议:TCP 与 UDP
- 网络层: 为主机提供数据传输服务. 而传输层协议是为主机中的进程提供提供数据传输服务. 网络层把传输层传递下来的报文段或者用户数据报封装成分组
- 数据链路层: 网络层针对的还是主机之间的数据传输服务, 而主机之间可以有很多链接, 链路层协议就是为同一链路的主机提供数据传输服务. 数据链路层把网络层传下来的分组封装成帧
- 物理层: 考虑的是怎样在传输传输媒体上传输数据比特流, 而不是具体的传输媒体. 物理层的作用是尽可能屏蔽传输媒体和通信手段的差异, 使数据链路层感觉不到这些差异
2. OSI
- 表示层: 数据压缩, 加密以及数据描述, 这使得应用程序不必关心在各台主机中数据内部格式不同的问题
- 会话层: 建立及管理会话
3. TCP/IP协议
将五层协议中的数据链路层和物理层合并为网络接口层
TCP/IP体系结构不严格遵循OSI分层概念, 应用层可能会直接使用IP层或网络接口层.
4. 数据在各层之间的传递过程
在向下的过程中, 需要添加下层协议所需要的首部或者尾部, 而在向下的过程中不断拆开首部和尾部
路由器只有下面三层协议, 因为路由器位于网络核心中, 不需要为进程或者应用程序提供服务, 因此也就不需要传输层和应用层
UPD与TCP比较, 分析上层协议应该使用UDP还是TCP
传输控制协议TCP, 提供面向连接, 可靠的数据传输服务, 数据单位为报文段; 提供可靠交付, 有流量控制, 拥塞控制, 提供全双工同学, 面向字节流(把应用层传下来的报文看成字节流, 把字节流组织成大小不等的数据块), 每一条TCP连接只能是点对点的(一对一)
用户数据报协议UDP, 提供无连接, 尽最大努力的数据传输服务, 数据单位为用户数据报; 没有拥塞控制, 面向报文(对于应用程序传下来的报文不合并也不拆分, 只是添加UDP首部), 支持一对一, 一对多, 多对一, 多对多的交互通信.
TCP主要提供完整性服务, UDP主要提供及时性服务.
理解三次握手以及四次挥手具体过程, 三次握手的原因, 四次挥手原因, TIME_WAIT的作用
TCP的三次握手
假设A为客户端, B为服务器端.
- B处于监听状态, 等待客户端的请求
- A向B发送请求报文, SYN=1, ACK=0, 选择一初始序号x
- B收到请求报文, 如果同意建立连接, 想A发送连接确认报文, SYN=1, ACK=1, 确认号为x+1, 同时也选择一个初始的序号y
- A收到B的连接确认报文后, 还要想B发出确认, 确认号为y+1, 序号为x+1
- B收到A的确认后, 连接建立
三次握手的原因
第三次握手是为了防止失效的连接请求到达服务器, 让服务器错误打开连接
TCP的四次挥手
- A发送连接释放报文, FIN=1
- B收到后发送确认, 此时TCP属于半关闭状态, B能想A发送数据但是A不能向B发送数据
- 当B不再需要连接时, 发送连接释放报文, FIN=1
- A收到后发出确认, 进入TIME-WAIT状态, 等待2MSL(最大报文存活时间)后释放连接
- B收到A的确认后释放连接
四次挥手的原因
客户端发送了FIN连接释放报文后, 服务器收到了这个报文, 就进入了CLOSE-WAIT状态, 这个状态是为了让服务器发送还未传送完毕的数据, 传送完毕之后, 服务器会发送FIN连接释放报文
TIME_WAIT
客户端接收到服务器端的FIN报文后进入此状态, 此时并不是直接进入CLOSED状态, 还需要等待一个时间计时器设置的时间2MSL. 这么做有两个理由:
- 确保最后一个确认报文能够到达. 如果B没收到A发送来的确认报文, 那么就会重新发送连接释放请求报文, A等待一段时间就是为了处理这种情况的发生
- 等待一段时间是为了让本连接持续时间内所有产生的报名都从网络中消失, 使得下一次新的连接不会出现旧的连接请求报文.
可靠传输原理, 并设计可靠UDP协议
TCP使用超时重传来实现可靠传输: 如果一个已经发送的报文段在超时时间内没有收到确认, 那么就重传这个报文段. (实现方法: 确认机制, 重传机制, 滑动窗口)
一个报文段从发送再到接收到确认所经过的试产称为往返时间RTT.
最简单的方式是在应用层模仿传输层TCP的可靠性传输。下面不考虑拥塞处理,可靠UDP的简单设计。
- 1、添加seq/ack机制,确保数据发送到对端
- 2、添加发送和接收缓冲区,主要是用户超时重传。
- 3、添加超时重传机制。
详细说明:送端发送数据时,生成一个随机seq=x,然后每一片按照数据大小分配seq。数据到达接收端后接收端放入缓存,并发送一个ack=x的包,表示对方已经收到了数据。发送端收到了ack包后,删除缓冲区对应的数据。时间到后,定时任务检查是否需要重传数据。
目前有如下开源程序利用udp实现了可靠的数据传输。分别为RUDP、RTP、UDT。
面试常见问题之网络基础相关推荐
- 【基础概念】 Redis简介和面试常见问题
Redis简介和面试常见问题 简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起 ...
- Linux基础学习(十七)--- wiki,jira 搭建、公司面试常见问题
Linux基础学习(十七) wiki,jira 搭建.公司面试常见问题 mysql中 utf8 支持中文字符 du -sh * 查看当前目录所有文件大小 wiki 企业多人协作系统–>企业级文档 ...
- Interview:算法岗位面试—10.24下午—上海某软件公司(机器学习,上市)电话面试—考察SVM、逻辑回归、降低过拟合、卷积网络基础等
Interview:算法岗位面试-10.24下午-上海某软件公司(机器学习,上市)电话面试-考察SVM.逻辑回归.降低过拟合.卷积网络基础等 导读:当时电话来的非常快,我刚做完一家公司的笔试,接着来了 ...
- linux调整网页视频声音,网络学员面试常见问题请你修改一下LINUX的视频驱动和声音.DOC...
网络学员面试常见问题请你修改一下LINUX的视频驱动和声音 网络学员面试常见问题: 1.请你修改一下LINUX的视频驱动和声音驱动 答: redhatlinux中用sndconfig来设置声卡,如果没 ...
- 网络基础 TCP/IP协议面试常问知识点
网络基础 TCP/IP协议面试常问知识点 ****************** 如有侵权请提示删除 ********************* 1.网络包的组成: 报头/起始帧分界符--MAC头部-- ...
- python面试常见问题-Python面试常见问题,涉及Python各个方面
原标题:Python面试常见问题,涉及Python各个方面 爬虫面试常见问题 一.项目问题: 1.你写爬虫的时候都遇到过什么反爬虫措施,你是怎样解决的 2.用的什么框架.为什么选择这个框架 二.框架问 ...
- 网路学员面试常见问题:
网路学员面试常见问题: 1.请你修改一下LINUX的视频驱动和声音驱动 答: redhatlinux中用sndconfig来设置声卡,如果没有某个模块,就需要重新编译内核(编译最新发布的linux 内 ...
- Linux云计算面试常见问题三
Linux云计算面试常见问题三,今天将在前两篇的基础上,继续为大家带来Linux云计算面试题. ** 1.虚拟化平台在实施云时有何要求? ** 虚拟化平台在实施云时的要求包括: a)管理服务级别策略 ...
- 研究生计算机专业知识复试面试常见问题
研究生计算机专业复试面试常见问题 操作系统 1. 进程和线程区别和联系 2. 常见的调度算法 3. 死锁的产生和解决 4. 虚拟内存,页面置换算法 5. 磁盘调度 数据结构 1. 常见的排序算法过程和 ...
- Web的诞生和网络基础 | 读《图解HTTP》
当今互联网的由来 蒂姆·伯纳斯·李在1989年的时候提出一种设想,借助多文档之间的相互关联形成的超文本(HyperText),连成可相互参阅的WWW(World wide web,万维网). 对于这个 ...
最新文章
- HDFS-Shell
- Java 求一批数的绝对值
- 使用命令行结合jq提取出Kubernetes配置文件里的secret信息
- MemoryCache 使用不当导致的一个 BUG
- c# 如何读取和写入ini(配置文件)
- 在Javascript中得到站点的根路径
- 在网站中使用Session的简单例子
- python怎么用pandas查找指定字符串_Python Pandas:通过搜索子字符串查找表
- linux下的p2p终结者
- PS制作橙子鱼缸、折纸效果字
- 利用计算机建立动画中的 画面 由,计算机图形术在三维动画中的应用.doc
- 大数据调度平台Airflow版本升级方案文档(1.X升级到2.X)
- paddlepaddle_文件操作_画图操作_图片基本处理
- 【Java】位运算符---算术右移和逻辑右移、算术左移和逻辑左移
- 爬虫基本概念(新手必看)
- (UE4 4.27)自定义PrimitiveComponent
- 信号调理(信号调理)
- C++ 中 char[],char *,string之间转换
- 如何设置IIS中的HTTPS服务
- 用Java 实现MSN聊天功能
热门文章
- python计算一个多项式_急求 python 使用class定义多项式P(x)=a0=a1x+a2x^2……anx^n 使用__init__()产生一个列表记录a的值...
- x5开源库后续知识点
- 拼多多“出海”的三个考验?
- US Shirt Size
- OV7725鹰眼摄像头
- 电脑磁盘分区、合并的方法指南!
- 苹果手机如何设置喜欢的铃声?想给自己的iphone换个别具特色的铃声吗?
- Webpack Chunk 分包规则
- golang的dep和vender
- 60行C代码实现一个shell