应⽤层协议
http:超⽂本传输协议 --浏览⽹⻚ 端⼝号:80 /8080
Https:安全的超⽂本传输协议
S:SSL:安全套接字协议 端⼝号:443
URL https://www.nowcoder.com/jobs/recommend/campus
FTP --⽂件传输协议 端⼝号 (20/21) 控制层⾯ 数据层⾯
SMTP 端⼝号 25 POP3 端⼝号110 邮件协议
Telnet 端⼝号 23 远程登录协议
RDP --3389
DNS 端⼝号 53 域名解析服务 域名和IP地址的解析 便于记忆
110.242.68.4 对应 www.baidu.com
PDU–协议数据单元 封装和解封装
PDU–插板
上三层 --产⽣数据 —数据报⽂
四层 -----数据段
三层 -----数据包
⼆层 -----数据帧
⼀层------⽐特流
三次握⼿、四次挥⼿
传输层–提供可靠的传输 --TCP --⾯向连接的可靠传输协议
⾯向连接—通过三次握⼿、四次挥⼿机制保证的
1.三次握⼿
第⼀次握⼿ 客户端SYN —同步序列号请求 携带 序列号seq —0
ACK —代表确认 确认—序列号+1 ack —1
第⼆次握⼿服务端SYN+ACK(服务端)
第三次握⼿客户端ACK
2.四次断开(挥⼿)
客户端FIN–请求断开连接
服务端ACK–确认断开
服务端FIN–请求断开连接
客户端ACK–客户端确认断开
TCP报头 --报⽂的头部
一、TCP协议特点
TCP :Transmission Control Protocol,传输控制协议.
有连接 可靠传输 面向字节流 全双工
-
有连接:TCP类似于打电话,需要建立连接,才可以发送消息.
-
可靠传输:发送方发送的数据,并不是百分百发送给接收方,而是尽力而为,尽可能的把数据传输过去,同时,如果还是传输不过去,至少能知道.
-
面向字节流:数据传输与文件读写类似,是"流式"的(一次可以读一个字节或者十个字节或者一百个字节)
-
全双工:一个通信通道,可以双向传输.(既可以发送,也可以接收)
二、TCP协议段格式
source port,destinatio port:
UDP一样,都是表示源端口和目的端口
sequence number ,acknowledgement number:
任何一条数据都是有序号的,但是确认序号只有应答报文有.
32位序列号
TCP为了实现可靠性,提出了确认应答和超时重传来主要保证TCP的可靠性。32位序号就是针对TCP发送的数据按照字节进行编号(累加进行编号)。
因此只需要确定第一个字节的序号,根据数据长度就可以推算出其他字节的序号。那么在数据传输时只需要将第一个字节序号传输过去即可。
由于数据传输存在 “后发先至” 的问题,那么接收方回复的数据就不知道是针对那一条。因此在应答报文中,就可以利用序号确定对哪一条数据进行应答(回复时针对编号进行回复)。
32位确认序号
当接收方接收到数据后,按照接收到的数据最后一个字节序号 + 1 作为确认序号。如果返回的应答报文这个确认序号是上一条数据最后一字节序号加1,就证明这个序号以前的数据发送成功了。
4位首部长度:(32 bit)
一个TCP报头长度是可变的,并不是像UDP的报头一样固定8个字节.
因此,首部长度就描述了TCP报头具体多长,另外,选项部分之前的固定是20个字节.
首部长度-20字节 = 选项长度
注:首部长度这里的单位不是位,而是4字节.
eg:
首部长度:15→实际TCP报头的长度:4*15 = 60字节 选项长度: 60-20=40(字节)
data offset reserved:
保留六位,为以后的扩展提供位置,便于TCP扩展。
六位标志位
– URG: 紧急指针是否有效。
– ACK: 确认号是否有效(应答报文有效)。
– PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走。
– RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段。
– SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段。
– FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段。ACK这位如果为1证明就是应答报文,如果为0就不是。确认序号只有在应答报文中才有意义。其他几位后续的十种核心机制中会提到。
六位标志位,就是为了确定了这个报文是哪一类。
windows(16位窗口大小)
后面的滑动窗口中详细介绍。
checksum(16位校验和)
这里和UDP原理一样。根据一些算法计算出校验和,在接收的数据再计算一遍,然后对比是否相等,来确定数据是否准确。UDP这里有详细介绍。
urgentpinger(16位紧急指针)
标识了那部分数据为紧急数据。
option padding(选项)
TCP报头除过选项其他固定20位,即:首部长度 - 20 = 选项长度。TCP报头大小是可变的,就是因为选项的存在,选项对TCP报文一些属性进行解释说明。
UDP报头
一、UDP特点
1、无连接
UDP传输的过程类似于寄信,知道对端的IP和端口号就可以直接进行数据报传输,不用像TCP协议需要建立连接。
2、不可靠
UDP没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息。
3、面向数据报
UDP通过数据报的形式进行传输,用户的请求或响应都会从数据报转换成字符串
应用层交给UDP多长的报文,UDP原样发送,既不会拆分也不会合并
例:用UDP传输100个字节的数据,如果发送端一次发送100个字节,那么接收端也必须一次接收100个字节,而不能循环接收10次每次接收10个字节。
4、全双工通信
UDP的Socket既能读也能写,客户端和服务器都可以发送请求/接受响应。
二、UDP报文的格式
1. Source Port(源端口)
这个字段占据 UDP 报文头的前 16 位,通常包含发送数据报的应用程序所使用的 UDP 端口。接收端的应用程序利用这个字段的值作为发送响应的目的地址。这个字段是可选的,所以发送端的应用程序不一定会把自己的端口号写入该字段中。如果不写入端口号,则把这个字段设置为 0。这样,接收端的应用程序就不能发送响应了。
2.Destination Port (目的端口)
接收端计算机上 UDP 软件使用的端口,占据 16 位。
3.Lengh (长度)
该字段占据 16 位,表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度。因为 UDP 报文头长度是 8 个字节,所以这个值最小为 8。
4. Checksum(校验值)
该字段占据 16 位,可以检验数据在传输过程中是否被损坏。
IP报头
一、IP地址分类
从使⽤范围来讲:公有地址、私有地址
公有地址:全球唯⼀,付费使⽤
私有地址:本地唯⼀,免费使⽤
从版本分类:IPv4、IPv6
IPv4地址 192.168.1.1 32位的⼆进制数,以点分⼗进制的表示⽅ 法/书写⽅法表示 192.168.1.1 点分⼗进制 —由点区分的⼗进制
二、IP报文的格式
IP报头大小为固定20字节(20B*8=160bit),总共由12部分组成。
1. version---------版本(占4b,指IP协议的版本)。
2. Header Length—头部长度。
(头部长度是指IP报头的总长度,因为有Option可选部分,通常为20字节,在20–60字节)。
该字段单位为32位字(1个32位字为4字节),因此当ip报头长度为1111时是最大60字节;
IP报头长度不是4字节的整数倍是,就需要对填充域进行填充;
3.Differentiated Services Field(type of service)
用来指定特殊的报文处理方式
4. Total Length----总长度(占16b)
标示此IP报头和数据的之和的总长度。
总长度16位,一个数据最大长度65535字节;
链路只允许1500字节,超过的话需要进行MTU分片。
一个数据包由IP报头和数据两部分组成,而IP报头为20—60字节,所以不会有一个数据包里纯数据超过1480字节的。
5. Identification----ID标识符(占16b)
与标记字段和偏移字段用于IP报文分片。
Idertification(标识字段):
源站没发送一个分组,标识值+1
6. Flag----标记(占3b)
占3位,目前只有2位具有意义;
第一位没有被使用
第二位D时不分片为(DF),当DF位置为1时表示路由器不能对报文进行分片处理。
第三位M–More fragment—多分片(MF)
当路由器对报文进行分片时,除了最后一个分片的MF位设置为0外,其他所有分片MF位置为1,以便接收者直到收到MF位为0的分片为止。
7. Fragmentation offset----分片偏移(13b)
标识分片在分组中的位置。
片偏移以8个字节为偏移单位,分片的长度为8字节的整数倍;
注意:
MTU不是固定1500,这要取决现场物理环境;
MTU不包含帧头帧尾。
8. Time to live–TTL----生存时间(8b)
跳数大小,即数据包能传多少跳,
不同操作系统TTL的默认最大值会有所不同(linux-255;win98–225;win7/8/10–64);
表示数据包在网络中的寿命(最初以秒为单位,现在以跳数为单位,最大225);
路由设备每此转发将TTL值减1,TTL为0时丢弃该分组。
9. Protocol----协议(8b)
标识数据携带的数据是何种协议,标识传输层地址或协议号
如1代表ICMP,6代表TCP,17代表UDP
10.Header checksum----报头校验和(16b)
用于校验检查IP报头是否有出入。
只校验IP报头部,数据部分由高层协议校验(TCP头的校验字段包含IP头和数据的校验)
无需重复校验数据部分;
缩短路由器转发分组时的处理时间,数据部分由终端用高层协议校验。
1- 发送方先把校验和字段置为0,对首部中没个16bit(切割多个16b)进行二进制反码求和,结果存在校验和字段中。
2- 收到一份IP数据包后同样对首部中每个16b进行二进制码反求和,接收方计算中包含了发送方存在的首部校验和。
3- 如果传输过程无错误,接收方结算结果全为1,传输中出现错误或数据丢失校验和结果为非全1,接受者第丢弃校验未通过数据。
4- 不生成错误报文,由上层发现丢失数据进行重传。
11.source ip address----源IP地址(32b)
此数据发起者的IP地址。
12.Destination ip address----目的IP地址(32b)
此数据的接收者IP地址。
13.Option----可选字段(0–40B)
Option字段很少使用,用于控制,转发要求,测试等。
常用IP报头长度为20字节—显示为1010。
三次握手 四次挥手
作业:⾃⾏查找三次握⼿为什么是三次,四次挥⼿为什么是四次!(⾯试 官经典问题)
- 三次握手才可以阻止重复历史连接的初始化(主要原因)
- 三次握手才可以同步双方的初始序列号
- 三次握手才可以避免资源浪费
原因一:避免历史连接
简单来说,三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。
我们考虑一个场景,客户端先发送了 SYN(seq = 90) 报文,然后客户端宕机了,而且这个 SYN 报文还被网络阻塞了,服务端并没有收到,接着客户端重启后,又重新向服务端建立连接,发送了 SYN(seq = 100) 报文(注意!不是重传 SYN,重传的 SYN 的序列号是一样的)。
客户端连续发送多次 SYN (都是同一个四元组)建立连接的报文,在网络拥堵情况下:
- 一个「旧 SYN 报文」比「最新的 SYN 」 报文早到达了服务端,那么此时服务端就会回一个 SYN + ACK 报文给客户端,此报文中的确认号是 81(80+1)。
- 客户端收到后,发现自己期望收到的确认号应该是 200+1,而不是 80 + 1,于是就会回 RST 报文。
- 服务端收到 RST 报文后,就会释放连接。
- 后续最新的 SYN 抵达了服务端后,客户端与服务端就可以正常的完成三次握手了。
原因二:同步双方初始序列号
TCP 协议的通信双方, 都必须维护一个「序列号」, 序列号是可靠传输的一个关键因素,它的作用:
- 接收方可以去除重复的数据;
- 接收方可以根据数据包的序列号按序接收;
- 可以标识发送出去的数据包中, 哪些是已经被对方收到的(通过 ACK 报文中的序列号知道);
可见,序列号在 TCP 连接中占据着非常重要的作用,所以当客户端发送携带「初始序列号」的 SYN 报文的时候,需要服务端回一个 ACK 应答报文,表示客户端的 SYN 报文已被服务端成功接收,那当服务端发送「初始序列号」给客户端的时候,依然也要得到客户端的应答回应,这样一来一回,才能确保双方的初始序列号能被可靠的同步。
四次握手其实也能够可靠的同步双方的初始化序号,但由于第二步和第三步可以优化成一步,所以就成了「三次握手」。
而两次握手只保证了一方的初始序列号能被对方成功接收,没办法保证双方的初始序列号都能被确认接收。
原因三:避免资源浪费
如果只有「两次握手」,当客户端发生的 SYN 报文在网络中阻塞,客户端没有接收到 ACK 报文,就会重新发送 SYN ,由于没有第三次握手,服务端不清楚客户端是否收到了自己回复的 ACK 报文,所以服务端每收到一个 SYN 就只能先主动建立一个连接,这会造成什么情况呢?
如果客户端发送的 SYN 报文在网络中阻塞了,重复发送多次 SYN 报文,那么服务端在收到请求后就会建立多个冗余的无效链接,造成不必要的资源浪费。
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式:
- 这就意味着,关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了,但是客户端还能接收服务端的数据。
- 服务端收到客户端的 FIN 报文时,先回一个 ACK 应答报文,但此时服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。
从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK
和 FIN
一般都会分开发送,因此是需要四次挥手。
简单地说,前 2 次挥手用于关闭一个方向的数据通道,后两次挥手用于关闭另外一个方向的数据通道。
注意:在特定情况下,四次挥手是可以变成三次挥手的
⾃⾏查找CDN原理 --CDN(内容分发⽹络)
CDN 原理
CDN 就是内容分发网络的意思,其英文全称为 Content Delivery Network。
简单地说,CDN 可以提前把数据存在离用户最近的数据节点,从而避免长途跋涉经过长途骨干网,最终达到减少骨干网负担、提高访问速度的目的。
CDN 工作原理
加入了 CDN 之后,浏览器的网络请求就变成如下图所示的情况。
CDN 基本工作过程
- 浏览器发起图片 URL 请求,经过本地 DNS 解析,会将域名解析权交给域名 CNAME 指向的 CDN 专用 DNS 服务器。
- CDN 的 DNS 服务器将 CDN 的全局负载均衡设备 IP 地址返回给浏览器。
- 浏览器向 CDN 全局负载均衡设备发起 URL 请求。
- CDN 全局负载均衡设备根据用户 IP 地址,以及用户请求的 URL,选择一台用户所属区域的区域负载均衡设备,向其发起请求。
- 区域负载均衡设备会为用户选择最合适的 CDN 缓存服务器(考虑的依据包括:服务器负载情况,距离用户的距离等),并返回给全局负载均衡设备。
- 全局负载均衡设备将选中的 CDN 缓存服务器 IP 地址返回给用户。
- 用户向 CDN 缓存服务器发起请求,缓存服务器响应用户请求,最终将用户所需要偶的内容返回给浏览器。
CDN 基本工作过程
- 浏览器发起图片 URL 请求,经过本地 DNS 解析,会将域名解析权交给域名 CNAME 指向的 CDN 专用 DNS 服务器。
- CDN 的 DNS 服务器将 CDN 的全局负载均衡设备 IP 地址返回给浏览器。
- 浏览器向 CDN 全局负载均衡设备发起 URL 请求。
- CDN 全局负载均衡设备根据用户 IP 地址,以及用户请求的 URL,选择一台用户所属区域的区域负载均衡设备,向其发起请求。
- 区域负载均衡设备会为用户选择最合适的 CDN 缓存服务器(考虑的依据包括:服务器负载情况,距离用户的距离等),并返回给全局负载均衡设备。
- 全局负载均衡设备将选中的 CDN 缓存服务器 IP 地址返回给用户。
- 用户向 CDN 缓存服务器发起请求,缓存服务器响应用户请求,最终将用户所需要偶的内容返回给浏览器。
使用 CDN 服务的网站,只需要将域名解析权交给 CDN 服务商,接着将需要分发的内容上传到 CDN,就可以实现内容加速了!