计算机体系结构
- OSI七层协议: 物理层、数据链路层、网络层、运输层、会话层、表示层、应用层
- TCI/IP四层协议: 网络接口层、网际层IP、运输层(TCP/UDP)、应用层
- 五层协议: 物理层、数据链路层、网络层、运输层、应用层
五层协议结构
- 应用层: 通过应用进程间的交互来完成特定网络应用。如域名系统DNS、万维网应用HTTP协议、电子邮件的SMTP协议。数据单元是报文。
- 运输层: 负责两台主机中进程之间的通信提供通用的数据传输服务,进程利用该服务传送应用层报文。使用协议:传输控制协议TCP(报文段)、用户数据报协议UDP(用户数据报)。
- 网络层: 负责分组交换网上的不同主机提供通信服务。
- 数据链路层: 在两个相邻节点之间传送数据时,数据链路层将网络层交下来的IP数据报组装成帧,在两个相邻节点间的链路上传递帧。
- 物理层: 单位比特。
TCP/IP协议结构
层 | 层协议 |
---|---|
应用层 | HTTP/SMTP/DNS/RTP |
运输层 | TCP/UDP |
网际层 | IP |
网络接口层 | - |
物理层
通信方式
- 单向通信(单工通信)
- 双向交替通信(半双工通信)
- 双向同时通信(双工通信)
数据链路层
信道分类
- 点对点信道:一对一通信方式
- 广播信道:一对多方式
三个基本问题
封装成帧
将网络层传下来的分组添加首部和尾部,用于标记帧的开始和结束
透明传输
解决办法:发送端的数据链路层在数据中出现控制字符”SOH”或”EOT”的前面插入一个转义字符“ESC”,在接收端的数据链路层在把数据传送网络层之前删除这个插入的转义字符。这种方法称为字节填充或字符填充。
差错检测
目前数据链路层广泛采用循环冗余检测(CRC)来检测比特差错
网络层
网际协议IP
- 任务:根据主机和目的主机的地址传送数据。
- IP封装:数据在IP互联网中传送时会被封装成数据报文,IP协议的独特之处在与:再报文交换网络中主机在传输数据之前,无须与先前曾通信过的目的主机预先创建好一条特定的”通路”。互联网协议提供一种”不可靠的”数据包传输机制;也就是说它不保证数据能准确的传输。数据包在到达的时候可能已经损坏,顺序错乱,产生冗余包,或者全部丢失
地址解析协议ARP
- 实现IP地址–>MAC地址
- 方法:在主机ARP高速缓存中存放一个从IP–>MAC的映射表,这些都是该主机目前知道的一些地址。
网际控制报文协议ICMP
- 为了更有效地转发IP数据报和提高交付成功的机会。
网际组管理协议IGMP
运输层
- 网络层只是把分组发送到目的主机,但是真正的通信并不是主机而是主机中的进程。
- 运输层提供了进程间的逻辑通信
- 运输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看见的好像是在两个运输层实体之间有一条端到端的的逻辑通信信道
无连接的UDP的特点
- 无连接,即发送数据之前不需要建立连接,减少了开销和发送数据之前的时延。
- 尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。
- 没有拥塞控制
- 面向报文,发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。
- 支持一对一、一对多、多对一和多对多的交互通信。
- 首部开销小。
面向连接的TCP的特点
- 面向连接的运输层协议,应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。
- 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点(一对一)。
- TCP 提供可靠交付 的服务
- 提供全双工通信。
- 面向字节流。
TCP的三次握手
假设A 客户端,B 服务器端
- 首先B 处于LISTEN状态,随时等待客户端的连接请求
- A 向 B 发送请求报文段,SYN = 1, ACK = 0,选择一个初始序号X
- B 接收到来自A 的请求报文段,如果同意建立连接,那么A 发送连接确认报文段,SYN = 1,ACK = 1,确认号 X+1,同时选择一个初始序号Y
- A 收到B 的连接确认报文段后,还需要向B 发出确认,确认号为 Y+1,序号为X+1
- B 收到 A 的确认后,连接建立
通俗理解:
- A 使用手机给 B 拨打电话(第一次握手)
- B 接收了,并向A 发出确认 是A吗?(第二次握手)
- A 说:“是的,我是A”(第三次握手)
三次握手的原因
第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接
失效的连接:客户端发送的连接请求在网络中滞留,客户端因为没及时收到服务器发送过来的连接确认,因此就重新发送了连接请求。滞留的连接请求并不是丢失,之后还会到达服务器。
如果不进行第三次握手,那么服务器会误以为客户端重新请求连接,然后打开了连接,这个时候客户端并不会给服务器发送数据,这个连接就属于浪费资源
TCP的四次挥手
- A 发送连接释放报文段,FIN = 1
- B 接收到了之后发出确认,此时TCP 属于半关闭状态, B还可以向A 发送数据,但是A 不能向 B发送数据
- 当B 不再需要连接的时候,向 A 发送连接释放请求报文段,FIN = 1
- A 收到后发出确认,进入 TINE-WAIT 状态,等待2毫秒后释放链接
- B 收到A 的确认之后 释放连接
通俗理解:
- A与B 通电话,但这个时候A 有了结束电话的想法,于是和B 说,我想挂掉电话(第一次挥手)
- B 说我知道了,但是我还像一些话要说(第二次挥手)
- B 说了一段时间之后,也准备挂电话了(第三次挥手)
- A 心里想你终于说完了,于是登陆2毫秒就挂掉电话了(第四次挥手)
四次挥手的原因
客户端发送了FIN连接释放报文之后,服务器收到了这个报文,就进入了CLOSE-WAIT状态。这个状态是为了让服务器发送还没有传送外币的数据,传送完毕之后,服务器会发送FIN连接释放报文
最后TIME-WAIT原因:
- 确保最后一个报文能够到达,
- 等待一段时间是为了让本连接持续时间内所产生的所有报文段都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文段。
TCP的滑动窗口
看图很容易理解,不做解释
TCP可靠传输
TCP如何保证可靠传输?
使用超时重传,如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段
停止等待协议
- 无差错情况
- 有差错情况
TCP流量控制
流量控制就是指为了控制发送方的发送速率,保证接收方来得及接收
拥塞控制方法
TCP中拥塞控制的四种方法:慢开始、拥塞避免、快重传、快恢复
- 慢开始:当主机开始发送数据时,由于并不清楚网络的负荷情况,所以如果立即把大量数据字节注入到网络,那么就有可能引起网络发生拥塞。经验证明,较好的方法是先探测一下,即由小到大逐渐发送窗口,也就是说由小到大逐渐增大拥塞窗口数值。
- 拥塞避免:让拥塞窗口缓慢地增大,即每经过一个往返时间就把发送方的拥塞窗口加一,而不是像慢慢开始阶段那样加倍增长。
- 快重传:首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发送对己受到的报文段的重复确认。
- 快恢复:在图5-25点4中,丢失个别的报文段时,不启动慢开始,而是执行快恢复算法,将发送方调整门限值ssthresh = cwnd / 2 = 8,同时设置拥塞窗口cwnd = ssthresh = 8,并开始执行拥塞避免算法。
应用层
域名系统DNS
- 主机名->IP地址
- 使用 UDP 协议
文件传输协议FTP
- 使用TCP协议
远程终端协议(TELNET)
电子邮件协议
- 发送:SMTP
- 读取:POP3和IMAP
动态主机配置协议(DHCP)
点对点传输(P2P)
常见面试题
Web页面请求过程
在输入www.xxx.com
之后发生了如下过程
- 输入
www.xxx.com
- 检查是否有缓存(有–>9)
- DNS解析(URL–>IP地址)
- 发起 TCP 请求,建立连接
- 发送 Request
- 服务器接收 Request
- 关闭连接
- 检查状态码
- 准备呈现
- 层现(我们看到的网页内容)
常用状态码
类型 | 含义 | 解释 |
---|---|---|
1xx | 信息类 | 接收的请求正在处理 |
2xx | 成功类 | 请求正常处理 |
3xx | 重定向 | 需要进行附加操作完成请求 |
4xx | 客户端错误 | 服务器无法处理请求 |
5xx | 服务器端错误 | 服务器端请求错误 |
- 200 OK
- 204 无内容返回
- 206 部分内容返回
- 301 永久性重定向
- 302 临时重定向
- 304 自从上次请求后,请求的网页未修改过
- 400 请求报文语法错误
- 401 发送请求未通过认证
- 403 服务器拒绝访问
- 404 服务器找不到资源
- 500 服务器执行出现错误
- 501 服务器不具备完成请求的功能
- 503 服务器暂时处于超负载或者停机维护状态
参考
https://github.com/CyC2018/Interview-Notebook/blob/master/notes/HTTP.md
https://blog.csdn.net/a1414345/article/details/75171181
http://www.cnblogs.com/jesse2013/p/basicwebprocess.html