江西h5响应式网站建设设计,网站开发专员,网页设计与网页制作的实验报告,wordpress调用图片代码1. 网络模型
1.1 OSI 七层参考模型
七层模型#xff0c;亦称 OSI#xff08;Open System Interconnection#xff09;参考模型#xff0c;即开放式系统互联#xff0c;是网络通信的标准模型。一般称为 OSI 参考模型或七层模型。
它是一个七层的、抽象的模型体#xff…1. 网络模型
1.1 OSI 七层参考模型
七层模型亦称 OSIOpen System Interconnection参考模型即开放式系统互联是网络通信的标准模型。一般称为 OSI 参考模型或七层模型。
它是一个七层的、抽象的模型体不仅包括一系列抽象的术语或概念也包括具体的协议。 物理层负责传输原始的比特流数模转换、模数转换。数据链路层负责在直接相连的节点之间可靠地传输数据帧进行错误检测和纠正以及定义物理地址MAC地址。网络层负责在网络中的不同节点之间进行数据包的传输和路由选择使用逻辑地址IP地址进行寻址。传输层负责提供端到端的数据传输服务确保数据可靠地传输处理数据分段和重组提供差错恢复和流量控制等功能。会话层负责建立、管理和终止应用程序之间的会话Session提供数据同步和会话恢复等功能。表示层负责数据的格式化和解析进行数据的加密和解密以及处理数据的压缩和转换等操作。应用层负责提供网络应用程序之间的通信服务包括文件传输、电子邮件、远程登录等各种应用。
1.2 TCP/IP模型
TCP/IP模型是⽹络通信的事实模型⾃下⽽上分为四层
数据链路层⽹络层传输层应⽤层
TCP/IP模型是工程中实际使用的模型在工程实现中只需要关注传输层、应用层即可
TCP/IP模型体系结构如下 面试问题OSI 模型与 TCP/IP 模型的区别是什么
OSIOpen Systems Interconnection开放系统互联是⽹络通信的标准模型但是TCP/IP模型是事实模型对OSI模型进⾏了简化。
TCP/IP模型与之的区别在于下2层物理层和数据链路层合并为数据链路层上3层会话层、表示层、应⽤层合并为应⽤层 套接字Socket作为传输层以下⽹络的封装为上⾯三层提供了统⼀的接口。之所以这么做有如下好处
1上三层⽤于处理应⽤的业务细节⽽不关注通信细节差异性较⼤下四层实现通信细节⽽不关注业务细节更加通⽤
2上三层通常处于⽤户进程内⽽下四层作为OS内核的⼀部分提供
1.3 TCP/IP协议族
面试问题TCP/IP包含哪些协议分别有什么作⽤
1传输层协议
TCPTransmission Control Protocol传输控制协议。⼀个⾯向连接的协议提供可靠全双⼯字节流全双工Full Duplex是一种通信方式允许数据同时在两个方向上进行双向传输即发送端和接收端可以同时发送和接收数据。使⽤流套接字流套接字适用于需要可靠数据传输和双向通信的场景如文件传输、HTTP通信等。具有消息确认、超时、重传等机制UDPUser Datagram Protocol⽤户数据报协议。⼀个⽆连接协议使⽤数据报套接字数据报套接字适用于对实时性要求较高、对数据传输顺序和可靠性要求较低的场景如音视频传输、DNS查询等不能保证消息递送⼀定成功SCTPStream Control Transmission Protocol流控制传输协议。提供可靠全双⼯⾯向连接的协议。SCTP是多宿的通信的两端可以涉及多组IP端⼝通信。提供消息服务SCTP和TCP的主要区别是SCTP提供了多流和多宿的能力
2网络层协议
IPv4Internet Protocol version 4使⽤32位地址可用地址有限ICMPInternet Control Message Protocol⽹络控制消息协议处理主机和路由之间的消息通信IGMPInternet Group Management Protocol⽹络组管理协议⽤于⼴播通信ARPAddress Resolution Protocol地址解析协议把IPv4地址映射成⼀个硬件地址MAC地址⽤于⼴播⽹络RARPReverse Address Resolution Protocol反向地址解析协议把硬件地址MAC地址映射成IPv4地址IPv6Internet Protocol version 6使⽤64位地址可用地址空间巨大ICMPv6Internet Control Message Protocol version 6为IPv6协议提供地址解析、⽹络组管理等功能兼具ICMPv4、IGMP、ARP协议的功能
3数据链路层协议了解即可
BPFBSD packet filterBSD分组过滤器。提供数据链路层的访问能⼒Berkeley内核DLPIdatalink provider interface数据链路提供者接⼝。提供数据链路层的访问能⼒SVR4内核
1.4 TCP/UDP/SCTP协议
面试问题:TCP和UDP协议的区别是什么? 1UDP协议无连接的传输协议封装应用层数据到一个UDP数据报中之后再将UDP数据报封装到IP数据报中发送出去
1UDP数据报具有长度消息长度是用来告诉客户端在读取数据报时的起始和结束消息长度随着报文传递到对端(而非TCP的流式消息)
2UDP协议不具备传输的可靠性不提供确认、序列号、R1TT估算、超时、重传等机制
不保证UDP数据报一定到达最终目的地(无对端消息确认机制、超时、重传机制)不保证各个UDP数据报到达目的地的先后顺序(无消息序列号)不保证UDP数据报只送达一次(无消息序列号)
3UDP协议是无连接的协议两端的套接字不具有绑定关系
一个UDP客户端可以创建套接字并发送数据报给一个服务器然后立即使用同一个套接字发送另一个数据报给另一个服务器一个UDP服务端可以使用同一个套接字从若干个不同的客户户端接收数据报
4UDP协议是全双工协议 补充
数据报Datagram和数据流Stream是在网络通信中常用的两种数据传输方式它们有以下区别 1数据报Datagram - 数据报是一种面向无连接的传输方式每个数据报都是独立的、自包含的数据单元。 - 每个数据报都有自己的目标地址和源地址可以独立地通过网络进行传输。 - 数据报的传输是不可靠的可能会发生丢包、重复、乱序等问题。 - 例子UDP用户数据报协议使用数据报传输方式。 2数据流Stream - 数据流是一种面向连接的传输方式数据在发送端和接收端之间建立一个持久的、有序的字节流。 - 数据流是连续的、无边界的字节序列没有明确的分割单位。 - 数据流的传输是可靠的确保数据的有序、完整和无错误地传输。 - 例子TCP传输控制协议使用数据流传输方式。 数据报和数据流是两种不同的数据传输方式。数据报是独立的、自包含的数据单元每个数据报都有自己的目标地址和源地址传输是不可靠的。数据流是建立在连接上的持久字节流传输是可靠的确保数据的有序、完整和无错误传输。选择使用哪种方式取决于具体的应用需求和通信方式的特点。 2TCP协议有连接协议基于数据流会将上层消息封装为多个个分节每个分节以一个IP数据报发送
1TCP协议基于数据流传输本身没有消息长度
2TCP协议保证传输的可靠性更加可靠而非100%可靠
提供对端消息确认机制消息发出后等待对端确认才视作成功提供超时和重传机制消息发送后超过一定时间未收到确认则重发消息直至成功或者超过指定重试时间提供RTT估算提供动态估算客户端与服务器之间的RTT(round-triptime)算法以便知道一次RTT大概耗时提供消息序列号对个分节提供一个序列号(字节偏移量)以便对端在收到消息时根据序列号进行消息的排序和去重提供流量控制提供通告窗口(advertised window)告知对端当前能够接收多少数据从而确保发送端发送的数据量不会使接收缓冲区溢出;通告窗口随着消息的接收动态变化当为0时表示接收缓冲区已满需要等待应用从缓冲区读取数据后才能再次从对端接收数据即TCP负反馈机制通过接收端的速率限制发送端的速率
注TCP协议并不能保证100%的可靠性而是在尽可能保证可靠性的前提下能够让上层感知消息传递的异常
3TCP协议是有连接协议两端必须先建立连接才可以通信
4TCP协议是全双工(full-duplex)协议给定连接上应用可以在任何时刻即发送数据又接收数据 3SCTP协议有连接协议提供可靠性、排序、流控、全双工的为数据传送通过关联(association)表示两端的通信方式一个连接只涉及两个IP地址间的通信而一个关联指代两端的第一次通信但不一定是两个IP地址间的通信
1SCTP是面向消息的有消息长度各个消息按顺序送达对端(TCP不具有消息长度依靠上层应用自行设计应用层协议的长度)
2每个关联包含多个流(连接)单个流上消息丢失不会阻塞其它流上消息的传输(TCP只具有单个流会阻塞)
3SCTP提供多宿特性即两端能够支持多个IP地址一个端点可以有多个冗余连接走不同的基础设施从而增强应对网络故障的健壮性 补充
在SCTP流控制传输协议中多流Multi-Stream和多宿Multi-Homing是其特性之一提供了更灵活和高效的数据传输能力。 1多流Multi-Stream - 多流是指在单个SCTP连接中可以同时传输多个独立的数据流。 - SCTP允许应用程序在同一个SCTP连接上创建多个逻辑流每个流都有自己的序列号和传输控制。 - 多流特性使得应用程序可以将不同类型的数据分组到不同的流中实现并行传输和优化网络资源利用。 - 应用程序可以根据需要创建、选择和管理多个流以满足不同数据流的需求。 2多宿Multi-Homing - 多宿是指在SCTP连接中可以同时使用多个网络接口或IP地址进行通信。 - SCTP允许一个端点主机在多个网络接口上绑定多个IP地址并在通信过程中根据网络状况选择合适的地址进行数据传输。 - 多宿特性提供了冗余和负载均衡的能力当一个网络接口或IP地址不可用时可以自动切换到其他可用的接口或地址。 - 应用程序可以利用多宿特性提高连接的可靠性和可用性适应多网络环境下的数据传输需求。
1.5 TCP协议
1.5.1 TCP建链三次握手
面试问题什么是TCP的三次握手过程是怎样的
TCP建链的⼤致过程如下
1被动打开passive open服务端调⽤socket、bind、listen 3 个函数启动监听
2主动打开active open客户端调⽤connect函数连接服务端客户端发送SYN分节告知客户端发送初始序列号SYN分节不携带数据故其所在的IP数据报只包含⼀个IP头、⼀个TCP头和可选的TCP选项
3服务端发送ACK确认客户端发来的SYN同时发送⾃⼰的SYN给客户端告知服务端发送初始序列号
4客户端发送ACK确认服务端发来的SYN 注1服务端在同⼀个分节中发送ACK和SYN
注2服务端的初始序列化序列号和客户端的初始化序列号是2个独⽴字段分别代表各⾃发送的消息序列号
注3每次发送SYN都会携带当前的序列号每次回复ACK都会携带下⼀次消息的序列号即当前序列号1 场景举例好像两个⼈开始电话前先确认对⽅是否可以听到
Client你好可以听到吗SYN
Server我可以听到你可以听到吗ACK SYN
Client可以听到ACK
... ...开始后续谈话 什么是TCP选项
TCP建链时携带的连接控制参数。
TCP_MAXSEG设置MSSMax Segment Size发送SYN时告知对端可以接受的最⼤分节⼤⼩即在当前连接中每个TCP分节中可以接受的最⼤数据量接收SYN的⼀端会据此设置发送分节的 最⼤⼤⼩。通过TCP_MAXSEG设置
SO_RCVBUF设置接收缓冲区⼤⼩据此告知对端通告窗⼝的⼤⼩
SO_SNDBUF设置发送缓冲区⼤⼩ 1.5.2 TCP关闭连接四次挥⼿
⾯试问题什么是TCP的四次挥⼿过程是怎样的
TCP关闭连接的过程
1主动关闭active closeA端调⽤close函数发送⼀个FIN分节带序列号告知B端数据发送完毕
2被动关闭passive closeB端收到FIN后回复ACK分节给A端同时将接收数据作为⼀个
EOF⽂件结束符传递给上层应⽤通知上层应⽤数据发送完毕
3B端上层应⽤收到EOF后调⽤close函数同样发送⼀个FIN分节告知A端数据发送完毕
4A端收到FIN分节后回复⼀个ACK分节给B端⾄此两端都已关闭 注1之所以要两端都发送FIN是因为TCP是全双⼯两端都可能发送数据因此需要两端都发送FIN告知对端发送完毕
注2每次发送FIN都会携带当前的序列号每次回复ACK都会携带下⼀次消息的序列号即当前序列号1
注3执⾏完12两步后被动关闭的⼀端B端仍然可以向主动关闭的⼀端A端发送数据此时称为半关闭half-close
注4当⼀个Unix进程⽆论⾃愿的终⽌调⽤exit或者从main返回还是⾮⾃愿的终⽌收到⼀个进程终⽌信号所有打开的⽂件句柄都会被关闭这也会导致任何打开的TCP连接上也发送⼀个FIN分 节告知对端关闭内核⾏为这也是进程挂掉⽽操作系统未宕机时对端能够⻢上感知到断链 的原因
注5⽆论客户端还是服务端都可以主动关闭连接调⽤close函数 场景举例好像两个⼈结束电话前彼此告别
A我这边没事了挂电话了FIN
B好的ACK
B我这边也没事了可以挂电话了FIN
A好的ACK谈话结束 问为什么三次握⼿时服务端可以在⼀个分节同时回复ACKSYN。⽽在四次挥⼿中被动关闭的
⼀端要分两个分节发送ACK和FIN
因为TCP是全双⼯的四次挥⼿时两端的关闭是独⽴动作可以各⾃控制是否关闭⾃⼰发送消息的 通道。因⽽分为2组消息⼀条FIN和⼀条ACK 补充
1三次握手在第二步中服务端可以将ACK和SYN的响应合并在一个分节中发送。这是因为服务端在收到客户端的SYN分节后已经知道了客户端的初始序列号ISN并且服务端也需要发送自己的初始序列号ISN给客户端。因此服务端可以将ACK和SYN的响应合并在一个分节中发送以减少通信的往返时间RTT。
2因为主动断开连接方在断开连接后能收数据但不能发送数据此时被动断开连接方还没有断开连接既能接收数据又能发送数据。被动断开连接方和主动断开连接方可能还有别的需求因此需要单独执行ACK和SYN 1.6 TCP状态机
⾯试问题TCP连接有哪些状态分别有哪些含义
服务端建链状态机
CLOSED - LISTEN服务端调⽤listen函数被动打开
LISTEN - SYN_RCVD服务端接收SYN发送SYN ACK
SYN_RCVD - ESTABLISHED服务端收到ACK完成建链 客户端建链状态机
CLOSED - SYN_SENT客户端发送SYN
SYN_SENT - CLOSED客户端等待超时未收到ACK SYN
SYN_SENT - ESTABLISHED客户端收到ACK SYN发送ACK 主动关闭状态机
ESTABLISHED - FIN_WAIT_1A端调⽤close函数发送FIN主动关闭连接
FIN_WAIT_1 - FIN_WAIT_2A端收到ACK
FIN_WAIT_1 - CLOSINGA端收到FIN可能是B端同时调⽤了close函数同时关闭连接
FIN_WAIT_1 - TIME_WAITA端收到SYN ACK回复ACK表示B端主动建链
FIN_WAIT_2 - TIME_WAITA端收到FIN回复ACK
CLOSING- TIME_WAITA 端 收 到 ACK
TIME_WAIT- CLOSEDA端等待2MSL超时 被动关闭状态机
ESTABLISHED - CLOSE_WAITA端收到FIN恢复ACK表示关闭B端到A端连接
CLOSE_WAIT - LAST_ACKA端发送FIN表示关闭A端到B端连接
LAST_ACK - CLOSEDA端收到ACK TCP完整数据收发过程如下
注1建链后服务端对客户端请求的ACK是随着要写的数据⼀起发送的该过程减少⼀次IO交互称为捎带发送piggybacking捎带发送有时间窗⼝如果超过该窗⼝则独⽴发送ACK分组
注2关闭连接时主动关闭的⼀端会经历TIME_WAIT状态⽽被动关闭的⼀端会经历CLOSE_WAIT 状态 补充
时间窗口的意思是说如果当时没有要发送的数据ACK的发送不会等待太长时间(如果等待时间太长客户端收不到ACK会超市重传)则独立发送ACK 如果单独发送和接收⼀个分组使⽤TCP协议需要⾄少8个分组3次握⼿4次挥⼿1次发送⽽使⽤UDP协议只需要2个分组1个请求分组1个应答分组。可以看到使⽤UDP⽐使⽤TCP协议交互过程数据量较少故⽽性能更好但也牺牲了可靠性 1.7 TIME_WAIT状态
⾯试问题TCP协议中的TIME_WAIT是什么状态为什么要有该状态
主动关闭连接的⼀端会经历TIME_WAIT状态该状态会持续2MSL时⻓后才变为CLOSED状态 TIME_WAIT建议值为2min但通常为1~4min
MSLMaximum Segment Lifetime最⻓分节⽣命周期表示IP数据报能够在⽹络中存活的最⻓时间超过该时间的IP数据报将被忽略
跳限hop limit每个IP数据报中包含⼀个跳数限制即该数据报在链路中最⼤可跨过的路由器数超过该数量IP数据报会被忽略跳限字段为8位故最⼤值为255
迷途重复分组lost duplicate/ 漫游重复分组wandering duplicate由于路由异常⽽徘徊在⽹络中的TCP分节导致超时后⼜重复发送了该分节造成重复
TIME_WAIT状态存在的意义
1实现可靠的TCP全双⼯连接终⽌最后⼀个ACK丢失后可能需要重传因⽽需要TIME_WAIT状态进⾏中转
2允许⽼的重复分节在⽹络中消逝如果TCP连接断链后⻢上⼜使⽤相同的IP和端⼝建⽴⼀个连 接则新建连接有可能收到旧连接的报为了防⽌这种情况的发⽣需要在TIME_WAIT状态等待2MSL时⻓以保证上⼀个连接的包全部消逝后再启⽤新的连接 1.8 连接端⼝号
TCP、UDP、SCTP协议均有端⼝号的概念都使⽤16位整数表示端⼝号范围
不同协议之间的端⼝号不存在冲突故可以同时开启TCP、UDP、SCTP的相同端⼝号
与服务端指定端⼝建链时客户端同样需要使⽤⼀个临时端⼝与服务端进⾏通信该临时端⼝由协议 栈⾃动分配
套接字对⼀个TCP的通信链路包含⼀对套接字IP端⼝是定义两个连接端点的四元组本地IP地址本地TCP端⼝号外地IP地址外地TCP端⼝号 常⽤端⼝号范围
10~1023公共服务的端⼝号⽐如ssh的端⼝号22
21024~49151⽤于登记开启的监听端⼝号⽐如web服务的8080端⼝
349152~65535⽤于开启临时端⼝号与服务端进⾏通信
注端⼝号的范围根据不同的OS可能不同⼀般约定1024之前的端⼝为预留端口不可以⾃由使⽤ 问⼀个服务端能够承载多少连接是由什么决定的
对于客户端⽽⾔在物理层面由于⼀个Socket连接也被视作⼀个⽂件故会占⽤⼀个⽂件句柄客户端侧机器
在逻辑层面使⽤(协议源IP源端⼝⽬标IP⽬标端⼝)这个五元组来唯⼀标识⼀个连接故能够开启的连接多少取决于五元组中的组合有多少种。 理解误区由于机器可以开启的端⼝范围总是⼩于65535的因⽽容易理解为⼀台客户端机器上能够
建⽴到服务器的连接上限即为可以开启的端⼝数。实际上端⼝是逻辑概念建⽴连接的数量取 决于上述五元组中各个元素取值的组合。 问假设有固定数量的客户端机器想要发起上百万个连接到同⼀个服务器如何突破端⼝限制
由于机器数量固定故协议源IP源端口⽬标IP目标端口五元组中协议、源IP、⽬标IP即已 固定。而对于同⼀个目标端口服务器端口同⼀个客户端机器能够开启的最⼤端口数不会超过65535个因而想要发起上百万的连接需要提供多个目标端口服务器端口每个端口承担6w多 个客户端连接突破端口限制。 1.9 TCP数据发送过程了解
每个TCP套接字有⼀个发送缓冲区只有发送缓冲区满了才会发送数据(如果一个字节一个字节的发送数据效率较低)就好像往池子里灌水一瓢一瓢的灌比一滴一滴的灌效率更高通过SO_SNDBUF选项设置数据的发送过程如下
1TCP层当应⽤调⽤write时内核从该应⽤进程的缓冲区中复制所有数据写到套接字的发送缓冲区 中
2TCP层若发送缓冲区⽆法存放全部数据时则将应⽤进程置于休眠状态对于阻塞IO内核将不 从write系统调⽤中返回直到发送缓冲区腾出空间应⽤进程所有数据都拷⻉到发送缓冲区中
注仅当收到对端的ACK之后才能够不断清理发送缓冲区中已确认的数据
3TCP层本端TCP以MSS⼤⼩或者更⼩的块把数据传递给IP层每个数据块上有⼀个TCP头20字节MSS值由对端MSS选项传递
4IP层给TCP分节安装⼀个IP头组成IP数据报并按照⽬的IP地址查找路由表确定外出接⼝ 之后把数据发送给相应的数据链路期间IP层可能会对IP数据报分为多个分⽚发送
5数据链路层每个数据链路维护⼀个输出队列如果队列已满则新到分组会被丢弃并沿着协议 栈向上返回错误TCP层捕获该错误并尝试重传相应分节该过程并不会被上层应⽤感知 注⼀次write系统调⽤成功返回仅表示发送缓冲区可以复⽤并不表示对端已经接收到发送的数据 1.10 超时重传和快速重传
超时重传Timeout Retransmission和快速重传Fast Retransmission是在计算机⽹络中⽤于处
理丢失数据包和⽹络拥塞的两种重传机制。
1超时重传
超时重传Timeout Retransmission是指发送⽅在发送数据包后设置⼀个定时器如果在规定的时间内没有收到确认ACK或者重复确认Duplicate ACK发送⽅会认为该数据包丢失然后重新发送该数据包。这种机制基于超时的假设即数据包丢失的原因可能是⽹络拥塞、传输延迟等。超时重传的缺点是它需要等待超时时间才能重传数据包这会导致⽹络传输效率低下。 行为如果在超时时间内没有接收到确认发送⽅会假设该数据包丢失然后重新发送该数据包。
触发条件超时重传通常发⽣在⽹络拥塞或传输延迟导致数据包丢失的情况下。
2快速重传
快速重传Fast Retransmission是⼀种基于接收⽅的反馈机制的重传机制。当发送⽅发送⼀个数据包后接收⽅会发送确认ACK给发送⽅表示已经成功接收到该数据包。但是如果接收⽅收到了⼀个不按顺序的数据包例如接收⽅已经收到了数据包5但是却未收到数据包3此时会重复确认数据包4连发3次数据包4后发送端重传数据包3接收⽅会发送⼀个重复确认Duplicate ACK给发送⽅指示发送⽅某个数据包丢失。当发送⽅连续收到3次重复确认时它会⽴即重传相应的数据包⽽不必等待超时时间。这样可以快速恢复丢失的数据包提⾼⽹络传输效率。 原理接收⽅在收到⼀个乱序的数据包后会发送重复确认Duplicate ACK给发送⽅。
行为发送⽅在连续收到⼀定数量的重复确认时通常是3个⽴即重传对应的数据包⽽不必等待超时。
触发条件快速重传通常发⽣在⽹络丢包引起数据包乱序的情况下。接收⽅通过发送重复确认来指示发送⽅某个数据包丢失。 总结来说超时重传是在发送⽅设置的定时器超时后重新发送数据包⽽快速重传是在接收⽅发送重复确认后⽴即重传数据包。这两种重传机制在不同的情况下使⽤以提⾼数据传输的可靠性和效率。
1.11 TCP Header结构
技巧数据传输时间估算
使⽤ping()估算TCP数据传输时间⼀次ping()使⽤84字节的IP数据报
假设30次ping()测量的平均RTT时⻓为175ms且要发送2000字节数据每次发送40字节则⼀共发送50次
每次发送时除了40字节数据还包含 20字节的IP Header20字节的TCP Header⼀共80字节 则可以估算发送这2000字节的⼤概耗时为175ms * 50次 8750ms
1.12 TCP可靠传输
1什么是可靠传输
对于⽹络中的两个节点通信中间要经过很⻓的链路期间可能存在很多问题因⽽我们认为直接在⽹络中传输数据是不可靠的。
所谓可靠就是数据能够正常、完整、有序的被对端收到。TCP协议依靠如下机制实现可靠通信
ACK机制序列号机制重排机制窗⼝机制 补充
在TCP传输控制协议的可靠传输中有两个重要的机制重排reordering和窗口window。 1重排机制 重排指的是网络中的数据包可能以非顺序的方式到达接收方。这可能是由于网络拓扑、路由选择、拥塞等原因造成的。TCP使用序列号来标识发送的数据包接收方根据序列号来恢复数据的正确顺序。 当接收方收到乱序的数据包时它会将这些数据包缓存起来然后按照序列号对它们进行排序以确保数据包按正确的顺序交付给上层应用程序。TCP使用接收窗口来管理乱序数据包的缓存和排序。 2窗口机制 窗口机制是TCP中的流量控制和拥塞控制的基础。发送方和接收方都有一个窗口大小window size的概念。 发送方的窗口大小表示可以发送但尚未收到确认的数据量。发送方根据接收方发送的确认信息来动态调整窗口大小以控制发送的速率避免发送过多的数据导致接收方无法及时处理。 接收方的窗口大小表示它能够接收的数据量。接收方通过发送窗口大小信息给发送方告知发送方它目前的接收能力。发送方根据接收方的窗口大小来控制发送的速率以避免发送过多的数据导致接收方缓冲区溢出。 窗口机制使得发送方和接收方能够协调数据传输的速率以适应网络的状况和接收方的处理能力从而实现可靠的数据传输。
综上所述TCP通过重排机制和窗口机制来实现可靠传输。重排机制确保接收方能够正确排序乱序的数据包窗口机制用于流量控制和拥塞控制确保发送方和接收方之间的数据传输能够合理、高效地进行。
2什么是ARQ协议
ARQAutomatic Repeat Request协议是⼀种⽤于可靠数据传输的协议位于传输层。它是在数据通信中处理和纠正传输错误和丢失数据的⼀种机制。
ARQ协议的主要⽬标是确保数据的可靠传输通过引⼊ACK确认和超时重传机制 实现这⼀⽬标
ACK确认发送⽅在发送数据包后等待接收⽅的确认超时重传机制如果发送⽅在⼀定时间内未收到确认或者接收⽅通知数据包有错误则发送⽅会重新发送数据包。 ARQ协议主要有3种模式
1停等 ARQStop-and-Wait ARQ发送⽅发送⼀个数据包然后停⽌等待接收⽅的确认。只有在接收到确认后发送⽅才发送下⼀个数据包。
2连续 ARQContinuous ARQ发送⽅连续发送多个数据包⽽不等待每个数据包的确认。接收⽅收到数据包后发送累积确认指示已成功接收到⼀系列数据包。如果发送⽅未收到确认或收到确认指示有错误它将重传相应的数据包。类似pipeline
Go-Back-N在接收⽅发现错误或数据包丢失时发送⽅会重新发送整个窗⼝中未确认的数据包。Selective-Repeat选择重传在接收⽅发现错误或数据包丢失时发送⽅只会重传具有问题的数据包⽽不是整个窗⼝中的所有数据包。
3反馈 ARQFeedback ARQ接收⽅会周期性地发送确认消息以指示已成功接收到的数据包。发送⽅会根据接收到的确认信息进⾏重传处理。 注1停等 ARQ需要逐条处理消息的请求-响应可能产⽣性能问题因⽽较少被采⽤
注2kafka在应⽤层确保消息传递⼀致性时也使⽤了类似 Continuous ARQ 和 Feedback ARQ 的实现机制
3Stop-and-Wait ARQ
停等 ARQ 的⼯作原理如下
1发送⽅对接收⽅发送数据包然后等待接收⽅回复ACK并且开始计时
2在等待过程中发送⽅停⽌发送新的数据包
3当数据包没有成功被接收⽅接收接收⽅不会发送ACK。发送⽅在等待⼀定时间后重新发送数据包 缺点⻓的等待时间导致低的数据传输速度
4Go-Back-N
为了克服停等 ARQ 协议⻓时间等待ACK的缺陷连续 ARQ 协议会连续发送⼀组数据包然后再等待这些数据包的ACK。
什么是滑动窗⼝
发送⽅和接收⽅都会维护⼀个数据帧的序列这个序列被称作窗⼝。发送⽅的窗⼝⼤⼩由接收⽅确定⽬的在于控制发送速度以免接收⽅的缓存不够⼤⽽导致溢出同时控制流量也可以避免⽹络 拥塞。协议中规定对于窗⼝内未经确认的分组需要重传。
什么是Go-Back-N
回退N步协议允许发送⽅在等待超时的间歇可以继续发送分组。所有发送的分组都带有序号。在Go-Back-N协议中
发送⽅需响应以下三种事件
1上层业务发送数据调⽤send()时发送⽅⾸先要检查发送窗⼝是否已满
2发送⽅接收ACK在该协议中对序号为n的分组的确认采取累积确认的⽅式表明接收⽅已正确接收到序号n以前(包括n)的所有分组
3发送⽅等待超时若出现超时发送⽅将重传所有已发出但还未被确认的分组发送⽅在发完⼀个窗⼝⾥的所有分组后会检查最⼤的有效确认然后从最⼤有效确认的后⼀个分组开始重传
对于接收方而言处理动作如下
1若⼀个序号为n的分组被正确接收并且符合顺序则接收⽅会为该分组回复⼀个ACK并将该分组交由上层业务 处理否则丢弃分组
2若分组n已被接收并且交由上层业务处理则说明⽐n⼩的所有分组均已正确接收并交付处理 比如发送方一次性发送了序号为1、2、3、4、5的分组如果序号为2的分组丢失即便序号为3、4、5的分组都被正确接收但是不符合接收顺序发送方依然会重传2、3、4、5分组 Go-Back-N采⽤的技术包括序号、累积确认、检验以及超时重传等 缺点Go-Back-N改善了停等协议中等待时间较⻓的问题但仍然存在性能问题当窗⼝很⼤时如果发⽣重传则增加了重发消息的区间会⼤⼤降低效率
5Selective-Repeat选择重传
相⽐于Go-Back-N协议Selective-Repeat协议通过让发送⽅仅重传在接收⽅丢失或损坏了的分组从⽽避免了不必要的重传从⽽提⾼效率。
在Selective-Repeat协议下发送方需响应以下三种事件:
1从上层收到数据。当从上层收到数据后发送⽅需检查下⼀个可⽤于该分组的序号。若序号在窗⼝中则将数据发送
2接收ACK
若收到ACK且该分组在窗⼝内则发送⽅将那个被确认的分组标记 为已接收若该分组序号等于基序号则窗⼝序号向前移动到具有最⼩序号的未确认分组处若窗⼝移动后并且有序号落在窗⼝内的未发送分组则发送这些分组
3超时。若出现超时发送⽅将重传已发出但还未确认的分组。
注与GBN不同 SR协议中的每个分组都有独⽴的计时器
假设接收窗⼝的基序号为4分组⻓度也为4接收⽅需响应以下三种事件:
1序号在[4,7]内的分组被正确接收。该情况下
若收到的分组落在接收⽅的窗⼝内序号在 (4, 7] 区间将发送⼀个ACK若该分组是以前没收到的分组序号⼩于4则被缓存若该分组的序号等于基序号4则该分组以及以前缓存的序号连续的分组都交付给上层然后接收窗⼝将向前移动。
2序号在[0,3]内的分组被正确接收。在该情况下必须产⽣⼀个ACK尽管该分组是接收⽅以前已确认过的分组。若接收⽅不确认该分组发送⽅窗⼝将不能向前移动。
3其他情况忽略该分组。
对于接收⽅来说若⼀个分组正确接收⽽不管其是否按序则接收⽅会为该分组返回⼀个ACK给发送⽅。失序的分组将被缓存直到所有丢失的分组都被收到这时才可以将⼀批分组按序交付给上层并向前滑动接收窗⼝ ⽐如上⾯图示中序号为2的分组丢失则接收⽅每次收到消息后回复已确认的最⼤ACK 1发送⽅收到ACK后重发分组2接收⽅收到分组2后向前滑动接收窗⼝返回ACK5此时[0, 5]区间的消息已经全部正常接收并可以处理
6TCP协议和ARQ协议是什么关系
TCP是基于ARQ协议的它使⽤了ARQ的确认和重传机制来实现可靠的数据传输。TCP协议使⽤了⼀种ARQ协议的变体在TCP中发送⽅将数据分割成⼩的数据段并使⽤ARQ机制确保它们的可靠传输。发送⽅会等待接收⽅的确认并在需要时进⾏重传。接收⽅会对接收到的数据进⾏校验并发送 确认或请求重传的消息。
7如何理解RTT和RTO
RTTRound-Trip Time往返时延。表示从发送端发送数据开始到发送端收到接收端的确认假设接收端收到数据后便⽴即发送确认总共经历的时延 由三部分组成
链路的传播时间propagation delay链路传播时间Link propagation time是指信号在物理链路上传播所需的时间。它是从信号从发送端发送出去到达接收端的时间延迟。末端系统的处理时间末端系统处理时间End-system processing time是指在网络通信中数据到达接收端的末端系统后经过处理和操作所需的时间延迟。路由器缓存中的排队和处理时间queuing delay在路由器的缓存中排队和处理时间是指数据包在进入路由器后等待被处理和转发的时间延迟。
其中前两个部分的值对于⼀个TCP连接相对固定路由器缓存中的排队和处理时间会随着整个⽹络 拥塞程度的变化⽽变化。 所以RTT的变化在⼀定程度上反应⽹络的拥塞程度。 RTORetransmission TimeOut重传超时时间超时重传时间根据RTT动态调整由协议栈⾃动控制⼀般RTO⾄少为1.5倍RTTRTO过⼩则可能过于频繁的发起重传RTO过⼤则重传等待的时间可能过⻓
1.13 TCP流量控制
1什么是流量控制
双⽅在通信的时候发送⽅的速率与接收⽅的速率不⼀定相等如果发送⽅的发送速率太快会导致接收⽅处理不过来这时候接收⽅只能把处理不过来的数据存在缓存区⾥失序的数据包也会被存放在缓存区⾥如果缓存区已满发送⽅还在发送数据接收⽅只能把收到的数据包丢掉⼤量的丢包会极⼤浪费⽹络资源因此我们需要控制发送⽅的发送速率 让接收⽅与发送⽅处于⼀种动态平衡才好 对发送⽅发送速率的控制称之为流量控制。
2如何进⾏流量控制
通信的双⽅都拥有两个滑动窗口
⼀个⽤于接收数据称之为接收窗口⼀个⽤于发送数据称之为拥塞窗口即发送窗口
⽤于反馈接收窗口⼤⼩的ACK通知称为窗口通告
接收⽅每次收到数据包后可在发送ACK时同时告诉发送⽅⾃⼰的缓存区还剩多少空间。我们也把 缓存区的剩余空间⼤⼩称之为接收窗口⼤⼩⽤变量win来表示。
发送⽅收到之后便会调整⾃⼰的发送速率也就是调整⾃⼰发送窗⼝⼤⼩当发送⽅收到的接收窗口的⼤⼩为0时发送⽅就会停⽌发送数据防⽌⼤量丢包
上述过程即为TCP的负反馈机制通过接收端的反馈决定发送端的速率 注接收端⽆法直接主动告知发送端⾃⼰的接收窗⼝⼤⼩但通过发送窗⼝和接收窗⼝的动态调整接收端可以间接地影响发送端的发送速率实现流量控制。 问1若发送端因接收窗口为0⽽停⽌发送数据后如何判断是否可以再次发送数据
1当发送⽅收到接受窗口 win 0 时则停⽌发送报⽂并且同时开启⼀个定时器每隔⼀段时间向
接收端发送试探报⽂。
2接收⽅收到报⽂后通过ACK反馈当前接收窗口 win 的⼤⼩
3发送⽅收到ACK后判断接收窗口 win 的⼤⼩
如果 win 0则再次刷新定时器等待下⼀次发送试探报⽂如果 win 0则根据窗口⼤⼩发送适量的数据 问2接收窗⼝的⼤⼩固定吗
不固定接收窗⼝的⼤⼩是根据某种算法动态调整的 问3接收窗⼝越大越好吗
不是根据边际收益递减规律当接收窗⼝达到某个值的时候再增⼤的话也不怎么会减少丢包率的 了⽽且还会消耗内存。所以接收窗⼝的⼤⼩必须根据⽹络环境以及发送发的的拥塞窗口来动态调整。 问4发送窗⼝和接收窗⼝相等吗
不⼀定相等接收⽅在发送ACK报⽂的时候会告诉发送发⾃⼰的接收窗口⼤⼩⽽发送⽅的发送窗口会据此来设置⾃⼰的发送窗口但并不⼀定相等因为接收⽅把ACK报⽂发出去的那⼀刻就已经 在⼀边处理堆在⾃⼰缓存区的数据了所以⼀般情况下接收窗⼝ 发送窗口。
1.14 TCP拥塞控制
拥塞控制和流量控制采取的动作很相似但⼆者针对不同的问题
拥塞控制与⽹络的拥堵情况相关联⽽流量控制与接收⽅的缓存状态相关联
1什么是拥塞控制
假设主机A给主机B传输数据。两台主机在传输数据包的时候如果发送⽅迟迟没有收到接收⽅反馈的ACK那么发送⽅就会认为它发送的数据包丢失了进⽽会重新传输这个丢失的数据包。
然⽽实际情况有可能此时有太多主机正在使⽤信道资源导致网络拥塞了⽽A发送的数据包被堵在了半路迟迟没有到达B。这个时候A误认为是发⽣了丢包情况会重新传输这个数据包。
结果就是不仅浪费了信道资源还会使⽹络更加拥塞。因此需要进⾏拥塞控制。
2如何知道⽹络的拥塞情况
A与B建⽴连接之后就可以向B发送数据了然⽽这个时候A并不知道此时的⽹络拥塞情况如何此时 A不知道⼀次性连续发送多少个数据包。
拥塞窗口把A⼀次性连续发送多少个数据包称之为拥塞窗⼝⽤ N 代表此时拥塞窗⼝的⼤⼩ 为了探测⽹络的拥塞情况可以采取2种策略
1线性增⻓先发送⼀个数据包试探下如果该数据包没有发⽣超时没有丢包。则下次发送时就发送2个如果 还是没有发⽣超时事件下次就发送3个以此类推即N 1, 2, 3, 4, 5.....
2指数增⻓⼀个⼀个增加实在是太慢了所以可以刚开始发送1个如果没有发⽣超时就发送2个如果还是没有发送超时事件就发送4个接着8个...⽤翻倍的速度类推即 N 1, 2, 4, 8, 16...
缺点⽆论是第⼀种⽅法还是第⼆种⽅法最后都会出现瓶颈值。但第⼀种情况的增⻓速率过慢可
能很慢到达瓶颈值⽽第⼆种情况增⻓速度过快可能很快到达瓶颈值
为了解决探测过慢或过快的问题可以把第⼀种⽅法和第⼆种⽅法结合起来刚开始使⽤指数增⻓ 增⻓到某⼀个阈值记为ssthresh后就改为线性增⻓。我们把指数增⻓阶段称之为慢启动线性增⻓阶段称之为拥塞避免 图1 慢启动 3如果到达瓶颈如何处理 随着拥塞窗口的增加发送速率不断提高当TCP遇到分组超时重传时即认为发生了网络拥塞 1此时将更新ssthresh的值为当前拥塞窗口的一半上图中是更新为24的一半即12 2更新cwnd的值为1 3然后继续执行慢启动—拥塞避免如上图所示 如果TCP发送方接收到连续的3个重复确认则认为是正常的网络包丢失而不是网络拥塞造成的这正是快恢复算法的功劳 1重传丢失的分组 2执行快恢复算法 图2 拥塞避免 4什么是快速恢复
发⽣超时事件不⼀定是⽹络出现了拥堵。也有可能是因为某个数据包出现了丢失或者损坏。如果视作拥塞控制从最初状态开始则可能导致控制较为严格降低发送速率
为了上述情况我们通过冗余ACK来处理即连续3次收到重复确认表明数据包丢失了可以快速重 传丢失的数据包
假设A给B发送M1, M2, M3, M4, M5...N个数据包如果B收到了M1, M2, M4... 却始终没有收到M3这个时候就会重复确认M2意在告诉AM3还没收到可能是丢失了。
当A连续收到了三个确认M2的ACK且M3超时事件还没发⽣。A就知道M3可能丢失了这个时候A就不必等待M3设置的计时器到期了⽽是快速重传M3。并且调整 ssthresh MAX / 2但是这个时候并⾮把控制窗⼝ N 重置为1⽽是直接让 N ssthresh并线性增⻓。该过程称为快速恢复具有快速恢复的TCP版本称之为TCP Reno。 图3 快恢复 注另外⼀种TCP版本⽆论是收到三个相同的ACK还是发⽣超时事件都把拥塞窗⼝的⼤⼩设为1 从最初状态开始这种版本称为TCP Tahoe。
1.15 TCP/IP 协议栈报⽂格式举例
以UDP通信为例查看TCP/IP模型各层报⽂结构
1 链路层
2⽹络层IP协议
3传输层UDP协议 结论
MAC地址是以太⽹产物
IP地址是⽹络层产物
端⼝是传输层产物
4ARP协议网络层
Address Resolution Protocol地址解析协议把IPv4地址映射成⼀个硬件地址MAC地址⽤于
⼴播⽹络 5ICMP协议网络层 Internet Control Message Protocol⽹络控制消息协议处理主机和路由之间的消息通信 如果需要本文 WORD、PDF 相关文档请在评论区留言 如果需要本文 WORD、PDF 相关文档请在评论区留言 如果需要本文 WORD、PDF 相关文档请在评论区留言