- 一、OSI七层模型
- 二、TCP/IP五层模型
- 1.数据封装与分用
- 2.网络基础
- IP地址
- 早期固定分类的方式
- 动态划分的方式:子网掩码
- MAC地址
- 网络设备
- 3. 网络数据传输
- 三、重要协议
- 1.网际层协议与技术
- IP(Internet Protocol)
- ARP(Address Resolution Protocol)
- RARP(Reverse Address Protocol)
- ICMP(Internet Control Message Protocol)
- NAT(NetWork Address Translator)
- 2.传输层协议与技术
- TCP(Transmission Control Prortocol)
- UDP(User Datagram Protocol)
- UDP怎么实现可靠传输(UDP大小受限制怎么传输超过64kb的数据)?
- TCP VS UDP
- 3.应用层协议
- DNS(Domain Name System)
- HTTP(HyperText Transfer Protocol)
- 1.理解
- 2.HTTP协议格式
- 3.HTTP协议特点
- HTTPS
- 总结
- 在浏览器地址栏中输入一个URL都发生了什么?
- 一、应用层角度
- 二、传输层角度(TCP)
- 三.网际层角度(广域网数据传输流程)
简介:
本篇博客是对于网络相关重点知识的总结。包括网络基础知识、TCP/IP基础知识、IP协议、TCP与UDP、HTTP、HTTPS的相关知识。
网络协议分层的好处:解耦合。定义好两层间的接口规范,让双方遵循,不需要关心另一方如何具体实现。
一、OSI七层模型OSI:Open System Interconnection 开放互联系统
| OSI参考模型 | 功能 |
|---|---|
| 7.应用层 | 针对特定应用的协议,负责应用程序间的沟通 |
| 6. 表示层 | 设备固有数据转换格式和网络标准数据格式的转换 |
| 5.会话层 | 通信管理。负责建立和断开通信连接。管理传输层一下分层 |
| 4.传输层 | 管理两个节点(网络终端)之间的数据传输。负责数据可靠传输 |
| 3.网络层 | (IP地址的封装与解封装 )地址管理与路由选择。 |
| 2.数据链路层 | (MAC地址的封装与解封装)互联设备之间传送和识别数据帧 |
| 1.物理层 | 传输比特流,定义物理设备标准 |
补充:
- 物理层:该层数据叫做比特;
- 数据链路层:该层叫做帧,工作设备是交换机,数据通过交换机来传输。
- 网络层:该层数据就做数据包,工作设备是路由器。
- 传输层:主要是将从下层接收的数据进行分段传输,到达目的地进行重组。该层数据叫做段。
实际组建网络只是以OSI七层模型设计部分即TCP/IP五层模型来实现。
二、TCP/IP五层模型
1.数据封装与分用
应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部,称为封装;
数据封装的过程:
数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的“上层协议字段”将数据交给对应的上层协议处理,称为分用。
数据分用的过程:
2.网络基础
IP地址
作用:IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
格式:IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(4个字节。通常用“点分十进制”的方式来表示,即 a.b.c.d 的形式.
版本:IPv4(32位)(广泛使用)和IPv6(128位)。
组成:网络号 + 主机号
网络号:标识网段; 主机号:标识主机;
所有IP 地址分为五类:
特殊的IP地址:
- IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网;
- IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包;
- 127.*的IP地址用于本机环回(loop back 本机环回主要用于本机到本机的网络通信)测试,通常是127.0.0.1(A类中减去一个网络数量);
各类地址表示的范围:
| 分类 | 范围 | 适用网络 | 网络数量 | 主机最大连接数 |
|---|---|---|---|---|
| A类 | 0.0.0.0~127.255.255.255 | 大型网络 | 126(2^7 - 1 - 1) | 2^24 - 2 |
| B类 | 128.0.0.0~191.255.255.255 | 中等规模网络 | 2^14 - 1 | 2^16 - 2 |
| C类 | 0.0.0.0~127.255.255.255 | 小型网络 | 2^21 - 1 | 2^8 - 2 |
| D类 | 0.0.0.0~127.255.255.255 | |||
| E类 | 0.0.0.0~127.255.255.255 |
上述分类地址的方案中存在IP地址浪费的问题,引入子网掩码来进行子网划分。
格式:子网掩码格式和IP地址一样,也是一个32位的二进制数。其中左边是网络位,用二进制数字“1”表示,1的数目等于网络位的长度;右边是主机位,用二进制数字“0”表示,0的数目等于主机位的长度。子网掩码也可以使用二进制所有高位1相加的数值来表示,如以上子网掩码也可以表示为24。
计算方式:
网络号 + 子网号:将 IP 地址和子网掩码进行“按位与”操作,得到的结果就是网络号 + 子网号。
主机号:将子网掩码二进制按位取反,再与 IP 地址位与计算,得到的就是主机号。
之后IP地址的组成为:网络号 + 子网号 + 主机号,网络号和子网号统一为网络标识。
MAC地址**作用:**用于标识网络设备的硬件物理地址。
- 主机具有一个或多个网卡,路由器具有两个或两个以上网卡;其中每个网卡都有唯一的MAC地址;
- 网络通信:网络数据传输本质上是网络硬件设备将数据发送到网卡上或从网卡接收数据;
- 硬件层面,只能基于MAC地址识别网络设备的网络物理地址;
**表示:**长度为48位,及6个字节。一般用16进制数字加上冒号的形式来表示(例如:
08:00:27:03:fb:19)
**特殊的MAC地址:**广播数据报:发送一个广播数据报,表示对同网段的所有主机发送数据报。MAC地址为:FF:FF:FF:FF:FF:FF.
IP地址表述的是路途总体的起点和终点,是给人使用的网络逻辑地址;
MAC地址表述的是路途上每一个区间的起点和终点即每一跳的起点和终点是给网络硬件设备使用的网络物理地址;
- **集线器:**工作在物理层的网络设备,发送到集线器的任何数据,都只是简单的将数据赋值并转发到其他所有端口(物理端口)。
- 交换机: MAC地址转换表 + 转发对应端口。MAC地址转换表主要记录MAC地址与其后物理端口之间的映射。
- **主机:**根据网络分层从上到下封装。
- 主机&路由器: ARP缓存表 + ARP寻址
- **路由器:**路由 + NAPT。
路由控制表:所有主机都维护这一张路由控制表,记录IP数据下一步应该发给哪个路由器。
路由器的作用: - 网关:划分公网和局域网,某些路由器还可以将局域网划分为多个子网(不同网段)。
- 路由:路由是指在复杂的网络结构中,规划路线以寻找一条通往终点的线路。
3. 网络数据传输
局域网传输流程:集线器
涉及到封装、集线器转发和ARP寻址。
①源主机,发送HTTP请求到目的主机
②从上到下封装数据报:
应用层:HTTP协议首部
传输层:TCP协议首部(源端口、目的端口)
网络层:IP协议首部(源IP、目的IP)
数据链路层:以太网帧(源MAC、目的MAC)
③ARP寻址:寻找下一跳设备的MAC地址
(1)主机和路由器中都保存了一张ARP缓存表:通过IP地址可以找到对应的MAC地址。
(2)根据下一跳设备的IP地址,在ARP缓存表中能找到对应的MAC地址,则可以设置目MAC并发送数据报。
④找到目的MAC,发送数据
⑤转发数据:通过集线器转发到所有端口连接的设备
⑥接收数据报:目的主机看IP、MAC是否符合自己,符合则接收,否则丢弃
⑦从下到上分用:
数据链路层:目的MAC符合,接收
网络层:目的IP符合,处理
传输层:根据端口找到对应进程
应用层:把数据交给应用层,由应用程序根据应用层协议解析
⑧返回响应数据:和请求流程一样,只是源IP和目的IP交换,源端口和目的端口交换
(3)如果找不到,则发送ARP广播数据报:目的MAC为广播地址,询问下一跳设备的MAC地址。
④找不到目的IP,目的MAC设置为FF:FF:FF:FF:FF:FF:FF,发送广播数据报
⑤集线器转发数据
⑥接收广播数据报:目的主机判断IP是否相同,相同返回自己的MAC地址给源主机,否则丢弃
⑦响应
局域网传输流程:交换机
涉及到:交换机MAC地址转换表
①源主机,发送HTTP请求到目的主机
②从上到下封装数据报:
应用层:HTTP协议首部
传输层:TCP协议首部(源端口、目的端口)
网络层:IP协议首部(源IP、目的IP)
数据链路层:以太网帧(源MAC、目的MAC)
③ARP寻址:寻找下一跳设备的MAC地址
(1)主机和路由器中都保存了一张ARP缓存表:通过IP地址可以找到对应的MAC地址。
(2)根据下一跳设备的IP地址,在ARP缓存表中能找到对应的MAC地址,则可以设置目MAC并发送数据报。
(3)如果找不到,则发送ARP广播数据报:目的MAC为广播地址,询问下一跳设备的MAC地址。
④找到目的MAC,发送数据
⑤1.读取数据,可以知道源MAC的主机是连接哪个端口
2.通过目的MAC查找对应的端口
3.如果找到,直接将数据报转发到对应的端口
4.否则,将数据广播到所有端口,目的主机返回响应,即可记录目的主机MAC与端口
⑥接收数据报:目的主机看IP、MAC是否符合自己,符合则接收,否则丢弃
⑦从下到上分用:
数据链路层:目的MAC符合,接收
网络层:目的IP符合,处理
传输层:根据端口找到对应进程
应用层:把数据交给应用层,由应用程序根据应用层协议解析
⑧返回响应数据:和请求流程一样,只是源IP和目的IP交换,源端口和目的端口交换
局域网传输流程:交换机 + 路由器
涉及到:子网掩码、网关
①源主机,发送HTTP请求到目的主机
②从上到下封装数据报。
③检查目的主机是否和本机是同一网段:
(1)通过IP与本机子网掩码位做与运算,可以得到目的主机的网段(网络号)以及本机的网络号;
(2)判断目的主机和本机是否同网段,若是则与局域网交换机交换机流程相同
④本机无法处理跨网段的数据报,交给网关处理:
(1)找到本机相连的网关设备IP,也就是路由器的IP
(2)ARP寻址,根据网关IP查找对应的MAC地址
④发送数据报到网关设备(目的MAC为路由器的MAC)
⑤交换机,根据目的MAC找到对应的端口。
⑥转发数据报到网关(路由器)
⑦路由器解析数据报:
(1)从下到上分用
(2)ARP寻址,找到目的IP对应的MAC
(3)封装数据报并发送到目的主机
修改内容:源MAC:路由器的MAC
目的MAC:目的主机的MAC 或者 另一个路由器的MAC
⑧进入到目的主机所在的局域网
后序流程与上述过程相同
广域网数据传输流程在关于“浏览器地址栏中键入一个URL都发生了什么”的问题中具体说明。
三、重要协议
1.网际层协议与技术
IP(Internet Protocol)
IP大致分为三大作用模块:IP寻址、路由以及IP分片与重组。
IP分割处理与再构成处理
1.数据链路不同,MTU则相异
2.IP报文的的分片与重组:
分片往往在网络上遇到比较大的报文无法一下子发送出去才会进行处理。
经过分片之后的IP数据报在被重组的时候,只能由目标主机 进行。路由器虽然做分片但不会进行重组。
IP首部中的“片偏移”字段表示分片之后每个分片在用户数据中的相对位置和该分片之后是否还有后续其他分片;根据这个字段可以判断一个IP数据报是否分片以及当前分片为整个数据报的起始、中段还是末尾;
3.路径MTU发现
路径MUT:指从发送端主机到接收端主机之间不需要分片时最大MTU的大小,即路径中存在的所有数据链路中最小的MTU。
UDP情况下:
①发送时IP首部的分片标志位设置为不分片。路由器丢包。
②由ICMP通知下一次MTU的大小。
③UDP中没有重发处理。应用在发送下一个消息时会被分片,UDP层传过来的“UDP首部+UDP数据”在IP层被分片。
所有的分片到达目标主机后被重组,再传给UDP层。
TCP情况下:
①发送时IP首部的分片标志位设置为不分片。路由器丢包。
②有ICMP通知下一次MTU的大小
③根据TCP的重发处理,数据报会被重新发送。TCP负责将数据分成IP层不会再被分片的粒度后传给IP层,IP层不再左分片处理。
④不需要重组。数据原样发送给接收端主机的TCP层。
版本: IPv4、IPv6
IPv6:
必要性:为了根本解决IPv4地址耗尽的问题而被标准化的网际协议;
特点: IP地址的扩大与路由控制表的聚合、性能提升、支持即插即用功能、采用认证与加密功能、多播,Mobile IP成为扩展功能。
格式:将128比特IP地址以每16比特位为一组,每组":"隔开。
IPv4:
协议头格式:
作用:是解决地址问题的协议。以目标IP地址为线索,用来定位下一个应该接收数据分包的网络设备对应的MAC地址,实现链路内IP通信。
ARP的工作机制:
ARP借助ARP请求与ARP响应两种类型的包确定MAC地址。
①主机A为了获得主机B的MAC地址,起初要通过广播发送一个ARP请求包,其中包含主机B的IP地址。
②由于广播的包可以被同一个链路上所有的主机或路由器接收,因此ARP的请求包就会被这同一链路上的所有主机和路由器进行解析。
③如果ARP请求包中目标IP地址与自己的IP地址一致,那么这个节点就将自己的MAC地址塞入ARP响应包返回给主机A。
IP地址和MAC地址缺一不可
RARP(Reverse Address Protocol)
**作用:**是将ARP反过来,从MAC地址定位IP地址的一种协议。
ICMP(Internet Control Message Protocol)
作用: 确定IP包是否成功送达目标地址、通知在发sing过程当中IP包被废弃的具体原因、改善网络设置等。用于辅助IP确认网络是否正常工作,以及遇到异常时进行问题诊断。
ICMP的消息:
大致可以分为两类:通知出错原因的错误消息、用于诊断的查询消息
ICMP目标不可达消息
ICMP重定向消息
ICMP超时消息
ICMP回送消息
NAT(NetWork Address Translator)
作用:用于在本地网络中使用私有地址,在连接互联网时转而使用全局IP地址的技术。可以转换TCP,UDP端口号的NAPT(NetWork Address Ports Translator)技术,由此可以实现用一个全局IP地址与多个主机的通信。
NAT的工作机制:
在NAT(NAPT)路由器内部,有一张自动生成的用来转换地址的表。
利用NAT路由器将发送源地址转换为全局的IP地址再发送数据。反之,当包从目的地址发送富哦来时,目的地之先被转换成私有IP地址以后再被转发。
NAT的潜在问题:
无法从NAT外部向内部服务器建立连接。
转换表的生成与转换操作都会产生一定的开销。
……
解决:1.改用IPv6 2.NAT穿越
2.传输层协议与技术
IP首部中有一个协议字段,用来标识网络层的上一层所采用的的是哪一种传输层协议。
TCP提供可靠的通信传输,UDP长被用于让广播和细节控制交给应用的通信传输。
TCP(Transmission Control Prortocol)
作用: 在不可靠的互联网络上提供可靠的端到端字节流,对数据的传输进行详细控制。
TCP协议段格式
6位标志位:
URG:紧急指针是否有效
ACK:确认号是否有效
PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段
SYN:请求建立连接;我们把携带SYN标识的称为同步报文段
FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段
TCP是如何保证可靠传输的?
1.应用数据被分割成 TCP 认为最适合发送的数据块。 2.TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。 3.校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。 4.TCP 的接收端会丢弃重复的数据。 5.TCP对数据传输的管控主要体现在 安全机制 和 效率机制 两个方面。安全机制有确认应答、超时重传、连接管理、流量控制和拥塞控制。效率机制有滑动窗口、延迟应答和捎带应答。 6.ARQ协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
TCP对数据传输的管控主要体现在 安全机制 和 效率机制 两个方面。
安全机制:
1.确认应答机制
标志位ACK置为1,则代表确认号有效。
TCP将每个字节的数据都进行了编号,即序列号。每一个ACK都带有对应的确认序列号,表示下一次希望接收的数据的起始序列号。
2.超时重传机制
(1)主机A发送数据给主机B之后,可能因为网络拥堵等原因,数据无法到达主机B。
如果主机A在一个特定时间间隔内没有收到B发送来的确认应答,就会进行重发。
(2)主机B确认应答后,ACK中途丢失了,主机A未收到确认应答。
主机B收到很多重复数据,利用序列号去重。
机制:TCP动态计算最大超时时间,以保证在任何环境下都能较高效率的通信。
1.超时时间以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。
2.如果重发一次之后仍然得不到应答,等待 2 * 500ms 之后再进行重传。
3.如果过仍然得不到应答,等待 4 * 500 ms 进行重传。
4.以此类推,以指数形式递增。累积到一定重传次数,TCP认为网络出现异常,强制关闭连接。
3.连接管理机制
3.1三次握手建立连接
1.开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态
2客户端会随机初始化序号( client_isn ),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1 ,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。
3.服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号( server_isn ),将此序号填入TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1 , 接着把 SYN和 ACK 标志位置为 1 。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。
4.客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED 状态。
5.服务器收到客户端的应答报文后,也进入 ESTABLISHED 状态。
为什么要三次握手建立连接?
①为什么不是两次?
1.防止已经过期的连接请求报文突然又传送到服务器,因而产生错误、浪费资源。
在双方两次握手就能建立连接的情况下,假设客户端发送请求(1)建立连接,由于网络原因才造成请求暂时无法到达服务器。
客户端在长时间得不到应答的情况下重新发送请求(2),本次双方顺利建立连接并传输数据,最后断开连接。
这之后请求(1)才到达服务器,服务器立即返回确认报文并进入ESTABLSHED状态,但是已经进入COLSED状态的客户端无法再接收并确认,无法建立连接。导致服务器长时间单方面等待,造成资源浪费。
2.三次握手才能让双方均确认自己和对方的发送和接收能力都正常。
第一次握手,服务端可以确认自己的接收能力和对方的发送能力正常。
第二次握手,客户端可以确认自己发送能力和接收能力正常,对方发送能力和接收能力正常。
第三次握手:服务端可以确认自己发送能力和接收能力正常,对方发送能力和接收能力正常。
3.告知对方自己的初始序列号,并确认对方的初始序列号。
序列号与确认序列号是TCP实现可靠传输的原因之一。如果只是两次握手,只有客户端的初始序号可以得到确认,而服务端的初始序列号得不到确认。
②为什么不是四次?
三次握手已经可以确认双方的发送接收能力正常,完成对双方初始序列号的确认,三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。
3.2四次挥手断开连接
1.客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进 FIN_WAIT_1 状态。
2.服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入CLOSED_WAIT 状态。(被动关闭连接的,才有CLOSED_WAIT状态)
3.客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。
4.等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。
5.客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入TIME_WAIT 状态。(主动关闭连接的,才有 TIME_WAIT 状态)。
6.服务器收到了 ACK 应答报文后,就进入了 CLOSED 状态,至此服务端已经完成连接的关闭。
7.客户端在经过 2MSL 一段时间后,自动进入 CLOSED 状态,至此客户端也完成连接的关闭。
为什么要四次挥手断开连接?
1.TCP连接是全双工的,每个方向必须单独关闭。
2.第一次挥手之后,客户端发送了最后的数据,但服务端可能还有未发送的数据给客户端,客户端还需有接收的能力,所以第二次挥手服务端发送ACK应答给客户端,客户端还需要等待。
3.当服务端处理完数据后,第三次挥手向客户端发送FIN,客户端确认应答后服务端即满足了关闭的条件。
综上,也就是四次挥手是为了达到拆除两条通信信道和释放资源,保证数据传输完,双方都达到关闭连接的条件才关闭连接。
为什么 TIME_WAIT 等待的时间是 2MSL?
MSL是Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为TCP报文基于是IP协议的,而IP头中有一个TTL字段,是IP数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减1,当此值为0则数据报将被丢弃,同时发送ICMP报文通知源主机。
MSL与TTL的区别:MSL的单位是时间,而TTL是经过路由跳数。所以MSL应该要大于等于TTL消耗为0的时间,以确保报文已被自然消亡。
TIME_WAIT等待2倍的MSL,比较合理的解释是︰网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待⒉倍的时间。
比如如果被动关闭方没有收到断开连接的最后的ACK报文,就会触发超时重发Fin报文,另一方接收到FIN后,会重发ACK给被动关闭方,一来一去正好2个MSL。
2MSL 的时间是从客户端接收到FIN后发送ACK开始计时的。如果在TIME-WAIT时间内,因为客户端的ACK没有传输到服务端,客户端又接收到了服务端重发的FIN报文,那么2MSL时间将重新计时。
在Linux系统里2MSL默认是60秒,那么一个MSL也就是30秒。Linux系统停留在TIME_WAIT的时间为固定的60秒。
为什么需要 TIME_WAIT 状态?
1.防止具有相同四元组的旧数据包被收到;
2.保证被动关闭连接的一方能被正确的关闭,即保证最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭;
TIME_WAIT 过多有什么危害?
1.内存资源占用。从服务器来讲,短时间内关闭了大量的Client连接,就会造成服务器上出现大量的TIME_WAIT连接,严重消耗着服务器的资源,此时部分客户端就会显示连接不上。
2.对端口资源的占用,一个 TCP 连接⾄少消耗⼀个本地端口;从客户端来讲,客户端TIME_WAIT过多,就会导致端口资源被占用,因为端口就65536个,被占满就会导致无法创建新的连接。
解决方法:1.服务器设置SO_REUSEADDR 套接字选项来避免 TIME_WAIT状态。
2.调整系统内核参数
3.强制关闭,发送 RST 包越过TIME_WAIT状态,直接进入CLOSED状态。
close_wait大量出现的原因和解决方案
原因:状态一直停留在close_wait状态,而没有发送FIN信号并迁移到LAST_ACK状态,一般都是在收到主动关闭发起方的FIN信号后没有调用进程的close方法导致状态不迁移
解决方法:1、当收到客户端关闭连接之后,主动关闭进程 2、设置keepAlive参数。
4.流量控制
流量控制机制:TCP支持根据接收端的处理能力,来决定发送端的 发送速度 。
解决的问题:接收端处理数据的速度是有限的。如果发送端发送太快,导致接收端缓冲区被打满,如果继续发送就会造成丢包,继而引起丢包重传等等一系列连锁反应。
接收端将自己可以接收的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK给发送端。
接收端一旦发现自己的缓冲区快满了,就将“窗口大小”设置成一个 更小 的值通知给发送端。
发送端接收到这个ACK后,就会减慢自己的发送速度。
如果接收缓冲区满了,就会将“窗口大小”设置为0,发送端不在发送数据。
接收端在TCP首部的“选项”字段中设置 窗口扩大因子M(实际窗口的大小是“窗口大小” << M),给发送端发送窗口更新通知。
窗口更新通知可能在传输图中丢失
因此定期的,过了重发超时的时间发送端还没有接收到窗口更新通知,发送端会发送一个窗口探测的包,获取接收端窗口大小。
5.拥塞控制
TCP使用了四种算法实现拥塞控制:慢开始、拥塞避免、快速重传、快速恢复;
拥塞窗口:
发送方维持一个拥塞窗口 cwnd ( congestion window )的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。
发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。
1.慢开始:
解决的问题:计算机网络处在一个共享的环境,可能会因为其他主机的通信使得网路拥堵,当网络拥堵时,突然发送一个较大量的数据极有可能导致整个网络瘫痪。有效地减少通信开始时连续发包导致的网络拥堵,可以避免网络拥塞情况的发生。
慢启动机制:
最初将发送端的拥塞窗口大小设置为1个数据段(1MSS 最大报文段)。(慢启动)
每收到一个确认应答,把拥塞窗口大小翻倍,呈现指数式的增长(快增长)。
每次发送数据包的时候,将拥塞窗口和接收端主机反馈的窗口大小做比较,取较小的值作为实际发送的窗口;
拥塞窗口指数式的增长,拥堵状况激增甚至导致网络拥塞的发生。因此需要拥塞避免
2.拥塞避免:
拥塞窗口大小指数式增长直到拥塞窗口的值超出慢启动阈值(ssthresh),在每次收到确认应答时只允许以{(1个数据段的字节数 / 拥塞窗口(字节))* 1个数据段字节数 }这种比例放大拥塞窗口。此后拥塞窗口的大小呈现直线(加法增大)上升的趋势。
(TCP通信开始时,并没有设置相应的慢启动阈值,慢启动阈值等于拥塞窗口最大值。而是在超时重发时才会设置为当时拥塞窗口大小的一半)
当发生超时重发时,设置慢启动阈值为当前拥塞窗口大小的一半,拥塞窗口设置为1。重新开始慢开始。
3.快速重传:
发生超时,由重复确认应答(收到至少3次的确认应答数据段,说明网络拥堵较轻,发送方立即重传对方希望的收到的报文段)触发 高速重发机制。慢启动阈值大小设置为当时拥塞窗口大小的一半。拥塞窗口大小设置为该慢启动阈值 + 3个数据段的大小。
4.快速恢复:
主要是为了配合快重传。当发送方连续收到三个重复确认时,就执行“乘法减小”算法,慢启动阈值大小设置为当时拥塞窗口大小的一半。拥塞窗口大小设置为该慢启动阈值 + 3个数据段的大小。
效率机制:
1.滑动窗口
解决的问题:在进行数据传输时,如果传输的数据比较大,就需要拆分为多个数据包进行发送。TCP 协议需要对数据进行确认后,才可以发送下一个数据包。这样一来,就会在等待确认应答包环节浪费时间。
窗口的大小:指不需要等待确认应答包而可以继续发送数据包的最大值。
滑动窗口左边的是已经发送并被确认的分组,右边是还没有轮到的分组
滑动窗口内被分为两块,一块是已经发送但还未被确认的分组,另一块是窗口内等待发送的分组。
操作系统内核为了维护这个滑动窗口,需要开辟 发送缓冲区 来记录当前还有哪些数据没有应答;只有确认应答过的数据,才能从缓冲区删掉;随着已经发送的分组不断被确认,窗口内等待的分组也会不断被发送。整个窗口就会往右移动,让还未轮到的分组进入窗口内。
滑动窗口的大小决定了当前TCP发送包的速率,窗口越大网络的吞吐率就越高。滑动窗口的大小取决于拥塞控制窗口和流量控制窗口的两者间的较小值。
1.1窗口机制下,如果出现了丢包,如何进行重传?
1.丢包情况1:数据报已经抵达服务端,但服务端返回的ACK丢失了
这种情况下部分ACK丢失不要紧,可以通过后序的ACK进行确认。
2.丢包情况2:客户端发送的数据报直接丢失
当某一段报文段丢失后,发送端会一直收到丢失的数据包对应的那一起始序列号(图中对应1001)的ACK。
如果发送端主机连续三次收到了同一个序列号(1001)的应答,就会将对应的数据(1001~2000)重新发送。
接收端收到了想要的数据后,返回下一个ACK(图中对应7001,2001~7001接收端已经接收到了,被放到了接收端操作系统内核的接收缓冲区)
2.延迟应答
如果接收方立即返回ACK应答,返回的窗口可能比较小,为了在保证网络不拥塞的情况下尽量提高传输效率,接收方稍微等待一会,处理掉一部分数据,返回更大的窗口大小。
由于数量限制(每隔N个包就要应答一次)和时间限制(超过最大延迟时间就要应答一次),所以并不是所有的包都可以延迟应答。
3.捎带应答
捎带应答就类似于搭顺风车,比如在三次握手中从第二次握手就可以捎带数据给对方。
特点:
1.面向连接:应用程序在使用TCP协议之前必须建立TCP连接,在传输数据完毕之后,必须释放已经建立的TCP连接
2.TCO连接只能是点对点(一对一)的
3.TCP提供可靠交付的服务:通过TCP连接传送的数据无差错、不丢失、不重复、并且按序到达。
4.TCP提供全双工通信:TCP允许通信双方的应用进程在任何时候都可以发送数据。
5.缓冲区:TCP连接的两端都舍友发送缓冲区和接收缓冲区,用来临时存放双向通信的数据。
6.面向字节流
UDP(User Datagram Protocol)
作用: UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
UDP协议段格式:
UDP的特点:
1.无连接:直到目的主机的IP和端口号就直接进行传输,不需要建立连接
2.不可靠:没有任何安全机制
3.面向数据报:应用层交给UDP多长的数据报,UDP不拆分、不合并原样发送
4.缓冲区:UDP只有接收缓冲区,没有发送缓冲区
5.UDP 支持一对一、一对多、多对一和多对多的交互通信
6.UDP提供全双工通信
7.大小受限:UDP 的首部开销小,只有8个字节,比 TCP 的20个字节的首部要短
基于UDP的应用层协议:
NFS(网络文件系统)、TFTP(简单文件传输协议)、DHCP(动态主机配置协议)、BOOTP(启动协议,用于无盘设备启动)、DNS(域名解析协议)
答:实现的方式可以参照TCP可靠性传输的方式,将实现转移到应用层,在UDP协议协议上构建自己的协议。
1.引入序列号,保证数据顺序
2.引入确认应答机制,确保对端受到了数据
3.引入超时重传机制,如果隔一段时间没有应答就重发数据
4.添加发送和接收缓冲区
5.引入拥塞控制
已有基于UDP协议实现的可靠性传输协议
增强版本:RUDP、RTP、UDT
QUIC协议,解决了TCP队头阻塞问题,并对TCP的拥塞控制,可以更快建立连接。
TCP VS UDP
| UDP | TCP | |
|---|---|---|
| 是否连接 | 无连接 | 面向连接 |
| 是否可靠 | 不可靠传输 | 可靠传输,使用确认应答、超时重传、连接管理、流量控制、拥塞控制、滑动窗口、延迟应答和捎带应答 |
| 是否有序 | 无序 | 有序,TCP会依据序列号进行重排序 |
| 传输速度 | 快 | 慢 |
| 连接对象个数 | 支持一对一,一对多,多对一和多对多交互通信 | 只支持一对一通信 |
| 传输方式 | 面向报文 | 面向字节流 |
| 首部开销 | 首部开销小,仅8字节 | 首部开销最小20字节,最大60字节 |
| 适用场景 | 适用于那些对高速传输和实时性有较高要求的通信或广播通信(比如IP电话、视频会议、直播) | 适用于在传输层有必要实现可靠传输的情况(比如邮件传输) |
3.应用层协议
DNS(Domain Name System)
作用:将访问网站是的一串罗马字和点号组成的字符串自动转换为具体的IP地址。DNS系统可以有效管理主机名与IP地址之间的对应关系。
域名:指为了识别主机名称和组织机构名称的一种具有分层的名称。
DNS查询机制:
计算机要访问指定网站
1.解析器向DNS服务器查询IP地址。
2.浏览器搜索 自己的DNS缓存 (维护一张域名与IP的对应表);若没有,则搜索 操作系统的DNS缓存 (维护一张域名与IP的对应表);若没有,则搜索操作系统的 hosts文件(维护一张域名与IP的对应表)。若都没有,则找 tcp/ip 参数中设置的 首选 dns 服务器,即本地 dns 服务器(递归查询),本地域名服务器查询自己的dns缓存,如果没有,则进行迭代查询。将本地dns服务器将IP返回给操作系统,同时缓存IP。
3.找到了网站的IP地址,将其返回。
4.开始进行通信
HTTP(HyperText Transfer Protocol) 1.理解
HTTP是超文本传输协议。
1.协议:HTTP是一个用在计算机世界里的协议。它使用计算机能够理解的语言确立了计算机之间 交流通信的规范(两个以上参与者),以及相关的 各种控制和错误处理 (行为约定和规范)。
2.传输:HTTP是一个在计算机世界中专门用来 两点之间传输数据 的约定和规范。
3.超文本:HTTP传输的内容是超文本。超文本本身只是纯文字文件,但内部用很多标签定义图片、视频等的链接,再经过浏览器解释,呈现一个文字、有画面的网页了。
HTTP是一个在计算机世界中专门在 两点之间 传输 文字、图片、音频等 超文本 数据的 约定和规范
这种协议游走在浏览器(Browser)和服务器(Server)之间,双方通信需要遵循HTTP协议,双方才可以实现解耦合。
请求:Browser -> Server 发送数据
响应:Server -> Browser 发送数据
HTTP与IP、TCP和DNS密切相关:
发送端HTTP协议职责:生成针对目标WEB服务器的HTTP请求报文
发送端TCP协议职责:为了方便通信,将HTTP请求报文分割成有序的报文段,并可靠地传给对方。
IP协议职责:搜索对方地址,一遍中转一遍传送
接收端TCP协议职责:接收到报文段,并重组到达的报文段
接收端HTTP协议职责:对WEB服务器请求的内容进行处理
请求的处理结果也同样利用TCP/IP通信协议进行回转
HTTP协议包括 请求协议 和 响应协议
2.1 请求协议(Request):
1.请求方式(Method):
| 方式 | 说明 | 支持的HTTP协议版本 |
|---|---|---|
| GET | 获取资源 | 1.0、1.1 |
| POST | 传输实体主体 | 1.0、1.1 |
| PUT | 传输文件 | 1.0、1.1 |
| HEAD | 获得报文首部 | 1.0、1.1 |
| DELETe | 删除文件 | 1.0、1.1 |
| OPTIONS | 询问支持的方法 | 1.1 |
| TRACE | 追踪路径 | 1.1 |
| CONNECT | 要求用隧道协议连接代理 | 1.1 |
| LINK | 建立和资源之间的联系 | 1.0 |
| UNLINE | 断开连接关系 | 1.0 |
如何发送GET请求?
1.地址栏中输入URL + 回车
2.通过一些标签 、


