【计算机网络,mysql架构师面试题

2、UDP协议


2.1、UDP数据报

UDP(User Datagram Protocol):用户数据报协议

1)UDP概述

UDP只在IP数据报服务之上增加了很少功能,即 复用分用差错检测 功能

UDP的主要特点:

  • UDP是无连接的,减少开销和发送数据之前的时延

  • UDP使用 最大努力交付,即 不保证可靠交付(由应用层保证可靠交付)

  • UDP是 面向报文 的,适合一次性传输 少量数据 的网络应用

应用层给UDP多长的报文,UDP就照样发送,即一次发一个完整报文。在传输层称为报文段。如果数据太大,在传给网络层时还要分片,所以适合一次传输少量数据

  • UDP 无拥塞控制,适合很多 实时应用

  • UDP首部开销小,首部大小为 8B。而TCP首部为 20B

2)UDP首部格式

UDP首部字段(8B)

  • 源端口号:可有可无,在需要对方回信时选用。不需要时可用全0

  • 目的端口号:在终点交付报文时必须要使用到

  • UDP长度:UDP数据报的长度(包括 首部和数据),其最小值是8B(仅有首部)

  • UDP校验和:检验UDP数据报在传输中是否有错。有错就丢弃。该字段是可选的,当源主机不想计算校验和时,则直接令该字段为全0

还有一种出错情况:分用时,找不到对应的目的端口号,就丢弃报文,并给发送方发送 ICMP“端口不可达” 差错报告报文

2.2、UDP校验

伪首部:伪首部只有在计算检验和时才出现,不向下传送也不向上递交。伪首部 伪的就是IP数据报的首部

  • 0字段:固定部分,全0

  • 17字段:封装UDP报文的IP数据报首部协议字段是17。(IP数据报首部的协议字段,说明数据部分使用的是什么协议)

  • UDP长度:UDP首部8B + 数据部分长度(不包括伪首部)


如何用伪首部校验UDP数据报有没有发送差错

在发送端:

  1. 填上伪首部(伪首部只有在计算检验和时才出现)

  2. 先首部校验和字段填充全0

  3. 全0填充数据部分(目的是要让UDP数据报要看成许多4B的字串接起来)

  4. 伪首部 + 首部 + 数据部分采用 二进制反码求和(此时校验和字段全0)

  5. 求反码 填入检验和字段

  6. 去掉伪首部,发送

二进制反码求和具体来说就是:

0+0=0

1+0=0+1=1

1+1=10

其中10中的1加到了下一列去,如果是最高列的1+1,那么得到的10留下0,1移到最低列,与最低位再做一次二进制加法即可

在接收端:

  1. 填上伪首部

  2. 伪首部 + 首部 + 数据部分采用二进制反码求和(此时校验和字段有值)

  3. 结果全为1则无差错,否则丢弃数据报/交给应用层附上出差错的警告

3、TCP协议


TCP(Transmission Control Protocol):传输控制协议

3.1、TCP协议特点和报文段

1)协议特点

  • TCP是 面向连接 (虚连接,并不是物理连接)的传输层协议。打call

  • 每一条TCP连接只能有两个端点,每一条TCP连接只能是 点对点 的(无法用于广播或多播)

  • TCP提供 可靠交付 的服务,无差错、不丢失、不重复、按序到达。可靠有序,不丢不重

  • TCP提供 全双工通信

  • 发送缓存:准备发送的数据&已发送但尚未收到确认的数据

  • 接收缓存:按序到达但尚未被接受应用程序读取的数据&不按序到达的数据

  • TCP面向 字节流:TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。字节流中的每一个字节都按顺序编号

  • :流入到进程或从进程流出的字节序列

2)报文段首部格式

重点,单位4B

  • 固定首部(20B)

  • 源端口:2B

  • 目的端口:2B

  • 序号seq(sequencer:n. 音序器):4B;

在一个TCP连接中传送的 字节流 中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的第一个字节的序号。(一起来吃饭的一组人按顺序每个人分个号,但进去的时候只看第一个人的序号)

TCP头就是TCP首部,序号字段表示的是报文段中 第一个字节的序号

  • 确认号ack:4B

期望 收到对方 下一个报文段的第一个数据字节的序号。若确认号为N,则证明到序号N-1为止的所有数据都已正确收到。(服务员确认一下下一组人的第一个人是几号)

  • 数据偏移(首部长度) : 4位

TCP报文段的数据起始处 距离 TCP报文段的起始处 有多远,以 4B位单位,即1个数值是4B。 例如数据偏移是1111,10进制数是15,15*4B=60B。说明TCP首部长度为60B

  • 6个控制位

  • 紧急位URG(urgency:n紧急):URG=1时, 标明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用。(这组人有会员,先进去)

  • 确认位ACK:ACK=1时确认号有效,在连接建立后所有传送的报文段都必须把ACK置为1。(拿到号后,服务员必须给号盖章)

  • 推送位PSH:PSH=1时, 接收方尽快交付接收应用进程,不再等到缓存填满再向上交付。(进去以后,有一组人很急,要先吃)

  • 复位RST(rest:重置):RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输链接。(之前号码作废,重新取号)

  • 同步位SYN(synchronous:同步的): SYN=1时,表明是一个连接请求报文或连接接受报文。(我和服务员说取个号/服务员把号给我)

  • 终止位FIN:FIN=1时, 表明此报文段发送方数据已发完,要求释放连接。(一组人已经进去了,号可以作废了)

  • 窗口:2B

指的是发送本报文段的一方的接收窗口,即 现在允许对方发送的数据量

  • 检验和:2B

检验首部 + 数据,检验时要加上12B伪首部,第四个字段为6

  • 紧急指针:2B

URG = 1 时才有意义,指出本报文段中紧急数据的字节数。(是会员时,查看会员人数)

  • 选项(长度可变):最大报文段长度MSS、窗口扩大、时间戳、选择确认…

  • 填充:全0,保证TCP首部是4B的倍数,填充+选项=4B

3.2、TCP连接管理

**TCP连接传输三个阶段:**连接建立——数据传送——连接释放

1)TCP连接建立 (三次握手)

TCP连接的建立采用 客户/服务器 方式,主动发起连接建立的应用进程叫做 客户,而被动等待连接建立的应用进程叫 服务器

假设运行在一台主机(客户)上的一个进程想与另一台主机(服务器)上的一个进程建立一条连接,客户应用进程首先通知客户TCP,他想建立一个与服务器上某个进程之间的连接,客户中的TCP会用以下步骤与服务器中的TCP建立一条TCP连接:

TCP连接建立过程:

  • ROUND 1:

客户端发送 连接请求 报文段,无应用层数据

  • SYN=1(同步位:SYN=1时,表明是一个连接请求/连接接受报文)

  • seq=x(序号字段:随机分配,表示连接请求报文段第一个字节的序号)

  • ROUND 2:

服务器端为该TCP连接分配缓存和变量,并向客户端 返回确认报文段,允许连接,无应用层数据

  • SYN=1

  • ACK=1(确认位:ACK=1时确认号有效,连接建立后所有传送的报文段都必须把ACK置为1)

  • seq=y(序号字段:随机分配,确认报文段也有序号字段)

  • ack=x+1(确认号字段:因为客户端的连接请求报文段第一个字节的序号为x,表示期待客户端接下来的发送报文段的第一个字节的序号为x+1)

  • ROUND 3:

客户端为该TCP连接分配缓存和变量,并向服务器端 返回确认的确认报文段,可以 携带数据

  • SYN=0(发送连接请求报文/连接接受报文时SYN才为1)

  • ACK=1(确认位:ACK=1时确认号有效,连接建立后所有传送的报文段都必须把ACK置为1)

  • seq=x+1(序号字段:因为客户端之前的连接请求报文段第一个字节序号为x,下一个发送报文段就是x+1)

  • ack=y+1(确认号字段:因为服务端上次发来的确认报文段第一个字节序号是y,所以期待下一个服务端确认报文段的第一个字节的序号为y+1)

2)SYN洪泛攻击

SYN洪泛攻击发生在OSl第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN,SYN是TCP三次握手中的 第一个数据包, 而当服务器返回ACK后, 该攻击者就 不对其进行再确认,那这个TCP连接就处于 挂起状态,也就是所谓的 半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。这样更加会浪费服务器的资源。攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机,就无法为正常用户提供服务了。

解决办法:设置SYN cookie

3)TCP连接释放 (四次挥手)

参与一条TCP连接的两个进程中的任何一个都能终止该连接,连接结束后,主机中的“资源”(缓存和变量) 将被释放

  • ROUND 1:

客户端 发送 连接释放报文段,停止发送数据,主动关闭TCP连接

  • FIN=1(终止位:FIN=1时, 表明客户端数据已发完,要求释放连接。)

  • seq=u(序号字段:客户端发送的连接释放报文段的第一个字节序号为u,随机分配)

  • ROUND 2:

服务器端 回送一个 确认报文段,客户到服务器这个方向的连接就释放了一一但目前只处于 半关闭状态,因为服务器还可以发送数据

  • ACK=1(确认位:ACK=1时确认号有效)

  • seq=v(序号字段:服务端发送的确认报文段的序号为v,随机分配)

  • ack=u+1(确认号字段:客户端上次发来的连接释放报文段序号是u,期待客户端的下一个数据报的序号是u+1)

  • ROUND 3:

服务器端 发完数据,就发出 连接释放报文段,主动关闭TCP连接

  • FIN=1(终止位:FIN=1时, 表明服务端数据已发完,要求释放连接)

  • ACK=1

  • seq=w(序号字段:服务端发送的连接释放报文段的序号为w,因为这个报文段又是服务端自己发送的,所以序号又要随机分配)

  • ack=u+1(确认号字段:为什么和确认报文段一样呢?因为客户端没发送数据,所以继续期待客户端的下一个数据报的序号是u+1)

  • ROUND 4:

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-4NMiPMjG-1710852531696)]
[外链图片转存中…(img-DfwbDg01-1710852531697)]
[外链图片转存中…(img-K1HGsTuM-1710852531697)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-DkXmSODt-1710852531697)]

  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值