2021.11.1打卡
提纲
- ARP协议工作原理
- 介绍各种协议
- RARP协议工作原理
- TCP三次握手和四次挥手全过程
- 在浏览器输入网址后到呈现内容,发生了什么
- 域名解析的工作流程
- TCP和UDP的区别
- DNS域名系统,简单描述其工作原理
- 📌TCP三次握手过程?为什么是三次,两次握手可以吗?
- 了解交换机、路由器、网关的概念,并说出用途
ARP协议工作原理
ARP即地址解析协议,是工作在链路层的一种ip映射mac地址的协议。
- 源主机想要获取某个ip对应的mac地址时,会先查询本地的ARP缓存,如果查询存在,则ARP工作完成。
- 若不存在,主机则向网络广播发送包含查询ip的ARP请求包,该ARP请求包有源主机ip、源主机mac以及目标主机的ip,其他主机接收到ARP请求包,会判断目标ip是否为本机ip,不是则丢弃这个ARP包;
- 如果是,则取出源ip和源mac,更新缓存,同时发送包含自己的mac地址的ARP回应包,该回应包为单播;
- 源主机收到回应,将目标ip和mac映射关系更新到自己的ARP缓存里
介绍一下各种协议
(图片转载自牛客网评论区)
RARP协议工作原理
RARP协议是逆地址解析协议,作用是完成mac到ip地址的映射,主要用于无盘工作站。
工作原理:网络中配置一台RARP服务器,里面保存着mac地址和ip地址的映射关系,当无盘工作站启动时,就封装一个RARP数据包,里面有其mac地址,然后广播到网络上去,当服务器收到请求后,就查找对应的mac地址的ip地址装入相应报文中发回给请求者。因为需要广播请求报文,因此RARP只能用于具有广播能力的网络
TCP三次握手和四次挥手全过程
- 三次握手:
- 服务器监听某个端口,处于listen状态;
- 客户端初始化一个序列号,并且将SYN位置为1,发送给服务器,然后处于SYN-SENT状态;
- 服务器收到后,也初始化一个序列号,并把确认序列号设置为客户端发送序列号+1,同时SYN和ACK位置1,发送给客户端,然后处于SYN-RCVD状态;
- 客户端收到服务器包后,回应最后一个tcp包,确认序列号为服务器序列号+1,ACK为1,发送后客户端处于ESTABLISHED状态;
- 服务器收到确认tcp包后,也处于ESTABLISHED状态,三次握手完成。
- 四次挥手
- 主动关闭方(下称主动发)向被动关闭方(下称被动方)发送FIN位为1的TCP包,表明断开链接,进入FIN-WAIT_1状态;
- 被动方收到后,先回应主动方一个ACK为1的tcp包,表明同意关闭链接,进入CLOSED_WAIT状态;但此时链接还未关闭,双方未传输完成的数据仍要传输
- 主动方收到CACK应答报文后,处于FIN_WAIT_2状态;
- 待被动方接收/发送完数据后,再次向主动方发送FIN位为1的tcp包,表明可以断开链接,进入LAST_ACK状态;
- 主动方收到FIN包后,回应一个ACK包,然后等待2*msl(msl:报文最大存活时间)的时间,处于TIME_WAIT状态;
- 被动方收到ACK确认包后,连接断开,处于CLOSED状态,
- 主动方等待2*ml时间结束后,连接断开进入CLOSED状态;四次挥手完成。
在浏览器输入网址后到呈现内容,发生了什么
- 浏览器首先对url进行解析,确定请求的Web服务器和文件名,生成一个HTTP报文,随后利用DNS获得主机地址的ip地址,交付给操作系统进行发送,请求进入传输层;
- TCP发送数据前,首先要三次握手建立TCP连接,然后TCP对HTTP请求报文进行划分,加上TCP头部,把数据拆解成一块块的进行发送,添加源端口和目的端口,便交付给网络层;
- 网络层主要是通过查找路由表确定如何把包送达服务器,期间会经过很多路由器,但他们的工作都是一样,查找路由表确定下一跳的地址;
- 随即到达链路层,通过ARP协议查找目的ip地址的mac地址,有了mac地址,便可以通过路由器发送到服务器;
- 服务器返回请求后,tcp连接关闭,浏览器解析HTML,渲染呈现,
TCP和UDP的区别
- TCP是面向连接的,传输单位称为TCP报文段,UDP是无连接的,传输单位称为用户数据报;
- TCP有流量控制和拥塞控制,是可靠传输,UDP则是尽最大可能传输
- TCP是点对点传输,而UDP可以一对一,一对多,多对多
- TCP传输安全,UDP传输速度快,因此TCP多应用在邮件、网页业务,UDP则应用语音、视频等业务
放一个标准答案1(我认为的)
-
连接
- TCP 是⾯向连接的传输层协议,传输数据前先要建⽴连接。
- UDP 是不需要连接,即刻传输数据。
-
服务对象
- TCP 是⼀对⼀的两点服务,即⼀条连接只有两个端点。
- UDP ⽀持⼀对⼀、⼀对多、多对多的交互通信
-
可靠性
- TCP 是可靠交付数据的,数据可以⽆差错、不丢失、不重复、按需到达。
- UDP 是尽最⼤努⼒交付,不保证可靠交付数据。
-
拥塞控制、流量控制
- TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。
- UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。
-
首部开销
- TCP 首部长度较长,会有⼀定的开销,首部在没有使用「选项」字段时是 20 个字节,如果使⽤了「选项」字段则会变长的。
- UDP 首部只有 8 个字节,并且是固定不变的,开销较小。
-
传输方式
- TCP 是流式传输,没有边界,但保证顺序和可靠。
- UDP 是⼀个包⼀个包的发送,是有边界的,但可能会丢包和乱序。
-
分片不同
- TCP 的数据大小如果⼤于 MSS 大小,则会在传输层进行分片,⽬标主机收到后,也同样在传输层组装 TCP数据包,如果中途丢失了⼀个分片,只需要传输丢失的这个分片。
- UDP 的数据大小如果大于 MTU 大片,则会在 IP 层进⾏分片,⽬标主机收到后,在 IP 层组装完数据,接着再传给传输层,但是如果中途丢了⼀个分片,在实现可靠传输的 UDP 时则就需要重传所有的数据包,这样传输效率非常差,所以通常 UDP 的报⽂应该小于 MTU
DNS域名系统,简单描述其工作原理
- 以解析www.baidu.com为例,计算机首先向本地DNS服务器发送DNS请求,若本地缓存命中,到则DNS工作结束;
- 没能请求到就向根域名服务器发送DNS请求,根域名服务器发现是归.com顶级域名服务器管,便告诉计算机去向.com顶级域名服务器发送DNS请求;
- .com收到请求,发现域名归是www.baidu.com权威域名服务器管,便诉计算机去向www.baidu.com权威域名服务器发送DNS请求;
- 计算器再次向www.baidu.com权威域名服务器发送DNS请求,权威服务器查询后将对应的ip地址告诉本地DNS服务器,并且结果缓存,DNS工作结束。
📌TCP三次握手过程?为什么是三次,两次握手可以吗?
-
三次握手
- 客户端向服务器发送SYN=1的tcp包,表明想建立连接;
- 服务器收到SYN包,向客户端回一个SYN=1,ACK=1的tcp包;
- 客户端收到SYN-ACK包后,向服务器回一个ACK确认包;
- 服务器收到ACK确认包后,连接建立。
-
为什么两次握手不可以?
采用三次握手主要是为了避免给历史请求建立连接。
考虑这一种情况,C给S发送了一个SYN=1的包请求建立连接,但这个包因为网络延误没有到达,后面C再次向S发送SYN=1的包,此次成功建立了连接,并断开;关闭后,第一个延误的SYN包终于抵达,S认为C想要再次建立连接,S便回应了SYN-ACK包,如果采用二次握手,此时TCP连接已经建立,但C并不会向S发送请求,就会导致S一直在等待C的数据,造成资源的浪费。
了解交换机、路由器、网关的概念,并说出用途
-
交换机
交换机工作在数据链路层,允许端口之间建立多个并发的连接,允许多对计算机之间通信,实现多个节点之间的并发传输。
交换机一般以全双工方式工作,利用交换机可以实现虚拟局域网(VLAN),VLAN可以隔离冲突域,也可以隔离广播域
-
路由器
路由器工作在网络层,任务是连接不用的网路并完成路由转发。它主要完成两个功能:分组转发和路由计算。
前者处理通过路由器的数据流,关键操作是转发表查询、转发以及相关的队列管理和任务调度;后者通过和其他路由器进行基于路由协议的交互,完场路由表的计算。
-
网关
在传统的TCP/IP术语中,网关和路由器没有区别。
在现代网络术语中,网关和路由器的定义不同。网关能在不用协议间移动数据,而路由器是在不同网路间移动数据。
2021.11.2打卡
大失败,昨天忘记写LeetCode每日一题了。今天补上。
力扣每日一题2021.11.1
575. 分糖果【简单】
Alice 有 n 枚糖,其中第 i 枚糖的类型为 candyType[i] 。Alice 注意到她的体重正在增长,所以前去拜访了一位医生。
医生建议 Alice 要少摄入糖分,只吃掉她所有糖的 n / 2 即可(n 是一个偶数)。Alice 非常喜欢这些糖,她想要在遵循医生建议的情况下,尽可能吃到最多不同种类的糖。
给你一个长度为 n 的整数数组 candyType ,返回: Alice 在仅吃掉 n / 2 枚糖的情况下,可以吃到糖的最多种类数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/distribute-candies
- 分析:理解题目意思,也就是求数组candyType中糖的种类,和n/2之间的最小值。
- 算法设计:把数组candyType转换为不含重复的set集合,比较len(set)和n/2之间的最小指,将其返回。
class Solution:
def distributeCandies(self, candyType: List[int]) -> int:
return min(len(set(candyType)), int(len(candyType) / 2))
力扣每日一题2021.11.2
237. 删除链表中的节点【简单】
请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。
题目数据保证需要删除的节点 不是末尾节点 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list
- 分析:题目保证删除的节点不是末尾节点,因此可以把删除节点的后一个节点复制给删除节点,把删除节点的后一个删除
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteNode(self, node):
"""
:type node: ListNode
:rtype: void Do not return anything, modify node in-place instead.
"""
node.val = node.next.val
node.next = node.next.next
:rtype: void Do not return anything, modify node in-place instead.
"""
node.val = node.next.val
node.next = node.next.next
今天趁着双十一新用户优惠,入手了一年阿里的轻量服务器,折腾的一下午,今天也太摸了,改天在服务器部署个qq机器人玩一下