1、 网络出现的目的:实现数据在多个设备之间交换。
2、 网络上常见的设备:
组网用的设备:集线器,交换集;
联网用的设备:路由器
3、交换机
结点在硬件层面上是如何交换数据的?
交换机最底层的数据(物理上的)发送,数据是被发送给所有结点的;
因为局域网内的数据是发给全部结点的,所以交换只能起到局域网组网的作用。
4、 路由器
路由器是联网用的,工作在局域网和局域网之间交换数据的。
路由器划分局域网,工作在网络层。
5、 真实的计算机网络中,只采用的分层 + 常见协议(标准协议),OSI 7层协议(理想中的,实际中没有用起来)
6、TCP/IP模型
物理层:解决直接相连的结点的通信问题(网卡负责的工作)
数据链路层:解决局域网结点的通信问题(操作系统负责的工作)(内核态)
网络层:解决跨局域网结点和结点通信问题(操作系统负责的工作)(内核态)
传输层:解决的是进程到进程的通信问题(操作系统负责的工作)(内核态)
应用层:业务上的内容,怎么处理,每个业务相关(我们使用网络的工作,通过socket数据交换)(用户态)
7、 数据链路层主要解决的问题
1)广播域中,数据如何保证只有目标结点收到?
发送的数据中带着名字,这个名字用技术术语就是:MAC地址;每个网卡都有全世界独一无二的MAC地址。取数据中的目标MAC地址,和自己的MAC地址做对比,如果一样,则接收,并且把数据给了网络层继续处理,否则丢弃。(所以说局域网内没有安全的数据。)
2)冲突域的问题。
如果突然好多节点都发送数据,而信道(通信的通道)中一次只能发送有限的数据,大家就冲突了。
退让:大家都停一下,各自等一个随机时间,局域网内的节点数量不是无限多的。所以概率上是可以成功的完成,虽然可能需要退让一段时间。一个局域网里接入的设备特别多,就很容易卡。冲突概率变高了。大部分局域网是会划分冲突域 的。
8、在局域网内部,结点A的应用层是如何发送数据到B的应用层?
A应用层——》数据链路层:封装
B数据链路层——》应用层:解包/分用
解包:把对方加的各层的头全部删掉
分用:为了解决每层其实不止一种协议的问题
9、 数据类似一个脉冲图,每个路由器都会在网络层对数据进行重新处理。
源+目的IP是远大目标
源+目的MAC是小目标
小目标必须根据大目标推断而来。
10、三个通信的场景:
局域网内设备和设备之间,为什么能直接通信?
(物理层+链路层)
局域网内,应用层和应用层之间通信需要注意什么?
(封装+解包/分用)
互联网内,应用层和应用层之间通信需要注意什么?
(在网络层重新加工数据:主要变更源 + 目标MAC地址
根据源+目标IP,确定目标MAC,这是路由器的作用)
11、网络在计算机中所起的作用:
I)只要在互联网中的设备,就可以实现数据的交换(结点对结点)
Ii)只要在互联网中的设备,设备上任意两个进程之间可以进行数据交换(端对端)
12、不同层称呼数据的方式:
应用层:请求/响应
传输层:UDP:数据报/TCP:段
网络层:IP:包
数据链路层:帧
13、什么是socket套接字?
OS系统提供的一套标准接口(不是Java中的接口),可以让所用应用层的程序,使用网络进行数据的交换。
14如何在互联网中确定一个进程呢?
IP + 端口。
所谓端口,就是[0-65536]的数字。
四元组标识互联网的唯一一个通信通道:
本地IP + 本地port + 远端IP+远端port
五元组 = 四元组 + 协议信息(TCP/UDP)
为了让IP地址可以唯一标识一台设备,所以一个IP地址只能属于一台设备,反过来,一台设备可以有多个IP地址。
为了让port端口可以唯一标识一个进程,所以一个port只能属于一个进程,反过来,一个进程可以有多个port。
15、传输层最常见的两个协议:
UDP:用户报文协议——不可靠的,无连接的,面向报文的
TCP:传输控制协议——可靠的,有连接的,面向流的
16、应用层上的C/S架构:客户端(Client)/服务器(Server)架构
17、UDP协议三个特点:
- 不可靠的
如果你发送的数据过多,或者网络不太好的时候会出现:
I) A发送的数据B没有收到,同时A不知道这个事情。你发送的数据对方是否收到你不清楚。
UDP的发送成功:指的仅仅是数据被发送到网卡(网络)上了,不代表对方确实收到了。
Ii)A是按照|abc| |def| |hij|顺序发送的,不代表B也一定按照同样的顺序|abc| |def| |hij|收到,UDP不保证发送的数据报的顺序 - UDP无连接
每次发送时带着Server的信息(IP+port),不需要提前做准备工作(建立连接) - 面向数据报文
A发送的数据按照某种方式发送了三个数据报文,假设B能可靠的(收到并且有序)收到了数据则B也一定按照这种顺序三个报文的形式收到的。
即A调用了几次发送,对等的B就需要调用几次接收。
18、TCP协议(面向字节流)三个特点:
- 可靠的
A是按照|abc| |def| |hij|顺序发送的,B一定保证收到(如果B收不到,A能知道)但是,B不一定按照同样的顺序|abc| |def| |hij|收到,它可以一次性接收|abcdefghij| 也可以|abcde| |fhij|也可以 - 有连接的
- 面向字节流
面向字节流给我们写代码造成一个问题,就是B收到了|abcdefghij|那B要如何知道A发送了几个请求过来?
需要指定应用层协议:
1、 规定请求是固定长度,每4个字节是一个请求
2、 规定先发送4个字节过来,这四个字节代表请求长度,然后再发送请求
3、 规定使用特殊字符分割\r\n
4、 规定一个链接中只会发送一个请求。
19、什么是TCP目标中的可靠性
- TCP的数据会被组合或者分割成合适的大小进行发送 ;
- 确保机制,发送的数据会尽可能的让对方收到——确认应答+超时重传;
- TCP保证不会收到错误的数据——校验和 ;
- 保证按序传递:去重——把收到的重复数据可以辨识出来并丢弃;
- TCP可以进行“流量控制”——可以根据一些信息,决定发送数据的速度/频率。
- 尽最大努力,把数据发送给对方,数据会被重新组装,使得更合适发送,确认应答+超时重传,流量控制;
2)保证数据按序到达——包括去重;
3)保证数据不会出错
20、HTTP——超文本传输协议;
HTML——超文本标记语言;
Web前端中Html主负责内容结构,Css主负责样式排版,Javacript主负责前端的逻辑(可编程,动态)。
HTTP协议:应用层协议,是应用层协议上的最常用协议。
主流的HTTP协议还是TCP为主。
21、规定状态,通知客户端发生了什么。
状态 = 状态码+描述。
1XX:中间状态的
2XX:成功相关
3XX:资源被移走的情况
4XX:由于客户端请求不对
5XX:由于服务器处理出错
常见状态:
200 一切正常
301 永久移走
302 临时移走
307 临时重定向
400请求格式出错了
404 请求的资源不存在
500 服务器内部错误
22、GET和POST的区别:
1)GET方法不能带Request Body
SELECT 那张表,条件
那张表——URL
条件——QueryString
2)Post方法允许带Request Body
GET建议具备等幂性,POST不做要求
幂等性:GET某个URL多少次都不会产生副作用
SELECT一张表2000次结果不变——没有副作用
INSERT一张表,每次提交,结果就会变化——有副作用。
23、校验和:checksum——弱正确性校验——哈希
Checksum 是一种hash算法;
发送方负责结算checksum,并且把结果填到header的校验和。
接收方收到数据后计算checksum。对比计算后的checksum是否就是UDP header中填写的checksum。如果不相等,表示数据被破坏了。
校验和失败,拒收即可——整个数据报就被丢掉了
24、确认应答机制
如何确保你是否收到了数据?需要接收方回应一声(SN——ASN)。
标记位:1/0
URG:urgent 紧急 16位紧急指针 ;
ACK acknowledge 应答 ACK == 1 表示segment有应答的包的职责,ASN是有效的;
PSHpush 推送 类似于加急快递——整份数据需要加急处理;
RST reset 重置,告诉对方有错误发生;
SYN:synchronized同步;
FIN final最终。
25、如果收不到应答怎么办?
超时重传。
当收到ACK的时候,就把对应的重传任务取消即可。
26、header中的SN和ASN可以达到什么目标呢?
1)可以实现确认应答机制——超时重传地址——尽最大努力,把数据发送给对方(可靠性);
2)接收方可以按照SN进行数据的重新排列后,再把结果给到应用层——保证数据有序传递(可靠性);
3)可以辨识出已经接受过的数据——数据去重(可靠性 )。
27、确认应答
SN是发送数据的第一个字节的序列
ASN是希望对方发送的下一个字节的序列
28、超时重传
不用可以区分为什么没有收到对方的ACK,只管重传即可,如果接收方重复接收,根据SN辨识出后,直接丢弃即可。
29、结论
TCP协议栈内部,需要维护一个数据结构,管理这个通信通道上的各种数据,需要维护发送缓冲区和接收缓冲区,需要事先沟通ISN,这个数据结构——就是通常所讲的连接——连接是因为要保证可靠性而出现的。