计算机网络学习————(五)TCP/IP学习

前文学习:

学习来源网站 :
极客时间

TCP协议

发展历史

ARPA-NCP协议------------可扩展性差、且对应的一般为单对单

解决问题:

在IP协议之上,解决网络通讯可依赖问题

点对点,面向连接

双向传递

字节流:打包成报文断、保证有序接受、重复报文自动丢弃

流量缓冲:解决速度不匹配问题

可靠的传输服务:保证可达、丢包时通过重发进而增加时延实现可靠性

拥塞控制

任意长度的可靠传输

TCP的作用:

把不定长的HTTP请求切分成为TCP合适的断,按照段发送到目的的服务器上。这个断在任意节点都有可能丢失、路径也可能不一致。

TCP必须保证每一个报文都能抵达HTTP 服务器,当服务器接收到TCP服务后按照相同顺序交由内核实现,再转交给上面的应用层,再按照顺序返回给客户端。

TCP:面向连接的、可靠的、基于字节流的传输层通信协议

IP:根据IP地址穿越网络传送数据

消息传输的核心要素

寄件人与收件人消息、IP地址、TCP(UDP)端口、HTTP Host/URI 等

物流订单号

IP序列号、TCP序列号

UDP头部

TCP协议的任务

主机内的进程寻址

创建、管理、终止连接

处理并将字节流打包成为报文段(IP报文)

传输数据

保持可靠性与传输质量

流量控制与拥塞控制

四元组(源地址、源端口、目的地址、目的端口)

对于IPV4地址,单主机最大TCP连接数为2^(32+16+32+16)

没有连接ID:QUIC协议

TCP 报文段

Source Port :源端口

Destination Port :目的端口

Sequence Number/Acknowledgment Number:用来唯一表示报文的

TCPdump 抓包

Linux使用TCPdump实现抓包

tcpdump #开启tcpdump  
tcpdump -D # 查看所有的网卡  
tcpdump -i eth1 #选择eth1网卡  
tcpdump -i lo #查看还回报文  
tcpdump -c  #抓取多少条报文
tcpdump -s  #指定抓取多少条报文  
tcpdump -c 2 -w a  #抓取2个报文并且保存到文件a中  
tcpdump -r a #读取a文件  
-C 1 -W 3 限制输入文件大小,超出后以后缀追加1等数字的形式递增,输出的最大文件数量为3  
-e 显示数据链路层的   
-q 显示网络层的    
-S 显示数据链路层显示绝对ACK替换相对序列号 
-A 显示ASKM的格式显示数据的内容  

建立连接

握手/建立连接的目标

同步Sequence序列号---------初始序列号ISN

交换TCP通讯参数------------如MSS、窗口比列因子等

三次握手:

客户端发送SYN序列号,服务端确认收到SYN回复一个ACK并且携带一个自己的SYN给客户端,然后客户端返回一个收到

SYN:同步

ACK:收到

为什么客户端和服务端的SYN不都从0开始是为了解决网络延迟、丢失,为了防止影响所以每次都是随机的

每个ACK都是上一个的SYN+1

SYN报文

在中间FLAG第7位SYN为1、为了确认确认号码有效需要将ACK也设为1

三次握手的时候五种状态。

CLOSE

LISTEN

SYN- SENT

SYN- RECEIVED

ESTABLISHED:结束状态

客户端发送一个SYN后就会从CLOSED状态进入SYN-SENT状态(这个状态很难看到),一旦收到服务端返回的SYN+ACK就会变到ESTABLISHED状态(状态改变的速度很快),服务端收到第一个SYN的时候就会进入SYN-RECEIVED状态 ,直到收到客户端ACK就会进入ESTABLESHED状态。

SYN的攻击方式:就是不使用操作系统内核提供的TCP协议,而是使用自己构造的SYN,从而使服务器大量属于SYN-RECEIVED状态,从而浪费了服务器的内存。

nestat命令查看TCP状态

nestat interval 重新显示选定的统计信息,各个显示时间暂停的间隔数秒
-a 显示所有连接和侦听端口
-n 以数字形式(IP地址)显示地址和端口号
-r 显示路由表
-s 显示每个协议的统计信息
-o 显示拥有的与每个连接关联的进程ID
-b/p 显示对应的可执行程序名字

两端同时发送SYN:双方使用固定源端口且同时建立连接

两边分别发送SYN,并且都接受到了SYN后就进入SYN-SENT状态。再从这个状态接受到ACK就会进入ESTABLISHED------------原本客户端不会进入 SYN-SENT的状态,现在由于接受的有SYN才会进入这个模式

TCB:保存连接使用的源端口、目的端口、目的ip、序号、应答序号、对方窗口大小、己方窗口大小、TCP状态、TCP输入/输出队列、应用层输出队列、TCP的重传等有关变量

三次握手中的性能

服务器三次握手流程

1.接受客户端发送的SYN网络分组,操作系统内核对这个进行操作

2.把SYN分组插入SYN队列中同时发送SYN/ACK确定消息。进入SYN-SENT状态

3.接受到客户端的ACK,并且把SYN队列中的之前SYN提出来放入ACCEPT队列

4.应用层次调用的时候其实调用的是ACCEPT队列里面的

负载与SYN、ACCEPT队列有关系------------调整

客户端调整connect超时时间调整

服务器端也可以设置内核限制

使用Fast Open降低延时是因为在服务端返回的时候添加了一个Cookie,这个Cookie就会缓存下次建立TCP连接的端口等信息,就可以实现下次进行TCP握手只需要一个RTT的时间

使用tcp_syncookies 预防SYN攻击

SYN攻击的实质就是塞满SYN队列,但是没有传输到Accept 队列中。

可以设置net.ipv4.tcp_syncookies=1 这样就当SYN队列满后,新的SYN不进入队列,计算出cookie再以SYN+ACK中的序列号返回客户端,当客户端正常发送报文时候,服务器会根据报文中携带的cookie重新恢复连接。

如何可靠传输数据。

基于MMS对TCP拆分

流的概念是:HTTP/2中提及------在TCP连接的基础上实现不需要请求-响应模式而是按照流ID等方法实现。

流拆分成段的依据:1.MMS:防止IP层分段 2.流控:接收端的能力

MMS:是指TCP承载数据,不包含TCP头部的大小

目的:1.尽量每个Segment报文携带更多的数据,以减少头部空间占用比率 2.防止Segment被某个设备的IP层基于MTU拆分

默认大小536字节,在握手阶段协商。

重传与确认

SYN序列号/ACK确认号------设计目的:解决应用层字节流的可靠发送(字节流而不是报文)

防止序列号回绕的请求------带上时间戳(TCP timestamp)更精准计算RTO 和PAWS

RTT:是指一个请求和响应的时间

测量方法:使用数据包中的Timestamp去

RTO(请求重发时长)的设置应该略大于RTT,所以RTO的设置应该更平滑,及随着时间不断改变,不适用RTT波动大的场景

滑动窗口

滑动窗口:分为接受窗口和发送窗口

发送窗口:1.已发送并接受到Ack确认的数据:1-31字节

2.已发送未收到ACK确认的数据,32-45字节

3.未发送但总大小在接收方处理范围内:46-51字节

4.未发送但总大小超出接收方处理范围:52-字节。

46-51字节为可用窗口

32-51字节为发送窗口

32-36如果已经确认了就可以向后滑动,将52-56放入窗口中

SND---------发送

SND.WND------发送窗口大小

SND.UNA------一个指针指向第一个发送但未确认的段号

SND.NXT---未处理的字节段号

接受窗口

RCV.WND---与内存和缓冲区有关,指的是接受窗口大小

RCV.NXT---接受到的段号的最后

窗口的滑动与流量控制

操作系统缓冲区与滑动窗口的关系

1.应用层没有及时读取缓存------窗口关闭及一直减少接收窗口大小

2.收缩窗口导致的丢包------缓存已经收缩,但是发送窗口不知道并且继续发送超出接收窗口大小的数据就会出现丢包情况,出现丢包情况就会再次探测窗口大小

设置合适的接收窗口应该考虑飞行中报文的数量,即时延*带宽就是最合

SWS糊涂窗口综合症:即首先客户端发送一较大的数据报文,服务器接收但只能处理其中的一部分另一部分停留在服务器的缓存中,而此时返回处理部分的响应ACK,会导致客户端重传在缓存中的数据,并且缩小发送窗口然后一直循环。

SWS避免算法:

接收方---David D Clark 窗口边界移动值小于Min(MSS,缓存/2)时,通知窗口为0

发送方---Nagle算法:没有已发送未确认报文段时,立即发送数据 。存在未确认报文段时,直到没有已发送未确认报文段/数据长度到达MSS时再发送

Nagle算法会引发TCP延迟确认---当有响应数据要发送的时候,ack会随着响应数据立即发送给对方,如果没有响应数据ACK的发送会有一个延迟等待,以等待是否有响应的数据可以一起发送

拥塞控制

网络中许多TCP就会占满带宽,这时候就会引起恶意性拥塞

需要全局思考:1.慢启动 2.拥塞避免 3.快速重传 4.快速恢复

慢启动原理:

拥塞窗口cwnd 它代表发送方在没有接收到ACK的时候能发送的最大报文数

最初值为10个MSS ,每收到一个ACK(没有丢包),cwnd就会扩充一倍。

通告窗口rwnd------影响发送窗口的大小

发送窗口cwnd------min(cwnd,rwnd)

慢启动解决了不知道当前网络的拥塞情况,合理的启动。

拥塞避免算法:

当慢启动到达了慢启动阈值时候就会改成为线性的方式增加,如果丢包了就重新设置阈值(为当前的一半),并且拥塞窗口也降低。

快速重传

失序数据段:它可以指在网络传输过程中由于各种原因(如网络拥塞、路由选择不同等)导致的数据包到达接收端时顺序错乱的现象。即数据包不是按照发送顺序到达目的地。

产生的原因:报文丢失,会产生连续的失序ACK、若网络路径与设备导致数据段失序,就会产生少量的失序ACK段、若报文重复,将会产生少量ACK段

定义:连续三次重复丢失的话就使用快速重传丢包的文件

实现:

接受方:

当接收到一个失序数据段时,立即发送它所期待的ACK序列号

当接受到填充失序缺口的数据段时,立即发送它所期待的下一个ACK序列号

发送方:

当接受到三个重复的失序ACK段时,不再等待重传定时器触发,立即基于快速重传机制重发报文段

快速恢复

为了应对这种并不是网络拥塞而导致的丢包情况可以使用快速恢复

步骤:将启动阈值设置为拥塞窗口的一半。设当前cwnd为启动阈值加上3*MSS

每收到一个重复ACK,拥塞窗口增加一个MSS

当丢失的数据包最终被确认后,TCP退出快速恢复,将cwnd设置为进入快速恢复前的ssthresh值。

重传方法

TCP 中Sequence序号的是累积确认的方法,所以并没有办法确认后面的序列号是否成功传入

1.仅重传丢失段------------保守乐观(当后面的报文丢失了就会出现问题)

2.重传所有段------------积极悲观 (可能浪费带宽)

3.综合上面两种------------SACK (选择性确认)通过服务器返回的ACK中携带了后面报文的情况,从而实现了选择性确认

BBR算法------基于测量驱动的算法

基于丢包的拥塞控制点:

高时延,大量丢包

随着内存便宜,时延更高

RTprop:是指发送数据到接受数据的时间

BBR使用了一个四阶段的状态机模型,包括启动(Startup)、排水(Drain)、探测带宽(ProbeBW)和探测RTT(ProbeRTT)。这些阶段帮助BBR动态调整发送速率和窗口大小,以适应不断变化的网络条件。

启动:在连接初期快速增加发送速率以迅速接近瓶颈带宽。

排水:如果在启动阶段过度填充了瓶颈缓冲区,则需要进入排水阶段来清空多余的队列。

探测带宽:在此阶段,BBR周期性地增加然后略微减少发送速率,以便准确估计当前可用的最大带宽。

探测RTT:定期降低发送速率以重新测量最小RTT,确保不会因为长时间未评估而错过了网络状况的变化。

关闭连接

目的:防止数据丢失;与应用层交互

四次挥手

FIN:结束

ACK:确认

客户端首先发送FIN给服务器(客户端从ESTABLISHED进入FIN-WAIT-1阶段),客户端接受到了FIN请求后由内核处理(将服务端从ESTABLISHED进入CLOSE-WAIT)。服务器返回FIN的确认报文(服务器将准备关闭应用程度),客户端接受到了确认消息(从FIN-WAIT-1编程FIN-WAIT-2)表示等待服务器确认关闭应该程序。经过一段时间后服务器发送确认关闭应用程序的FIN(从CLOSE-WAIT进入LAST-ACK阶段)表明服务器的应用程序已经关闭,客户端接受到FIN静如TIME-WAIT阶段(会保持2分钟的时间)并且返回ACK报文,服务器接受到ACK 进入CLOSE阶段

也可能两边同时发送FIN请求就直接关闭

优化

TIME-WAIT状态的意义:是为了延迟保护的,防止延迟发送过来的数据损坏新连接

优化TIME-WAIT状态:至少维持2MSL时长(报文最大生存时间)------是为了保持至少一次报文的往返时间都是不可复用的

或者可以设置TIME_WAIT的最大连接数量

遇到异常状态的时候可以通过查看RST复位报文直接关闭连接等

把RST置为1

标记位PUSH 是表示需要立即处理这个请求(他的段落一旦发送完成),而不是去等待缓存区加载完毕才处理

URG表示紧急标志位------当网络传输中如果还有数据想要终止传输的时,URG值为1就先处理这个请求不管其他数据

keep-Alive功能

用于检测一个长时间(心跳周期)没有发送任何数据的TCP链接,它会发送多个探测包(如果收到TCP应答则认为还是活跃的,否则会间隔探测包时长在次发送------最多默认发送9个)

多路复用

定义:在一个信道上传输多路信号/数据流的过程和技术

非组赛socket:同时处理多个TCP

使用协程处理的原理:利用等待的时间就可以处理进程中的其他程序,实现了多路复用

IP

无连接、非可靠、无确认

报文传输

支持广播、组播

分类地址

ip地址是又32位的二进制数表示------空间地址有2^32个

ip地址是层层分配的

优点:简单明了、具有3个级别灵活性、选录简单

CIDR

表示方法 ;A.B.C.D/N,N范围[0,32]

有子网掩码就可以将子网划分------------通过/n表示从前数n位是不变的32-n表示的就是分下来的子网

ARP、RARP协议

使用IP地址与MAC地址转换

MAC地址:实现本地网络设备间的直接传输

IP:实现大型网络间的传输

ARP:动态地址解析协议------------广播方式

交换机只认识MAC地址,所以主机A先是发送一个广播去获得在这个路由上的其他主机的MAC地址

因为发送广播传输的时候消耗是很大的,所以每次都会先检查本地缓存是否有然后才会以广播形式请求之后单播形式应答

RARP协议:从MAC地址寻找IP地址

启动的时候是没有配置IP地址的需要一台服务器(路由器)给他自动分配IP地址。

发送一个RABP的广播的形式请求,单播形式回应

ARP欺骗

通过主动回复广播形式,欺骗发送方的ip和mac地址映射表从而改变,使发送的消息需要通过C

IP地址短缺

因为公网的Ip地址是稀缺的

NAT技术前提:内网中主要用于客户端访问互联网、同一时间仅少量主机访问互联网、内网中存在一个路由器负责外网

单向(向外)转换NAT:动态映射------------将客户端中的源ip地址改为能够访问外网的路由器的ip其他不变。返回时也是设置为路由器的ip,只有到了路由器才改成为客户端的ip。

为什么能知道这个地址该转化成谁呢?

是因为路由器中存在一个映射表,将客户端的ip和目的服务器的ip都放在这个表中

改进版------增加端口映射:NAT路由器会更改里面的端口也有映射关系

双向(内向)NAT:IP地址静态映射

就能实现外网访问内网的时候可以转换了

IP选路协议

1.直接传输

2.本地网络间传输------内部选路协议RIP、OSPF

3.公网间传输------------BGP

路由表:只记录了下一跳的位置

RIP内部选路协议:基于跳数确定路由、基于UDP协议向相邻路由器通知路由表

问题:跳数度量、慢收敛、选路环路

OSPF 内部选路协议:

多级拓展结构:同级拓扑中的每台路由器具有最终相同的数据信息

每个拓扑使用AREA0连接

直接使用ip协议传递路由信息

BGP协议:是通过TCP传递网络信息的多个BGP路由器有IBGP协议和EBGP协议

报文细节

IHL:头部长度,单位字

TL:总长度,单位字节

Id:分片标识

Flags:分片控制

DF为1:不能分片 MF为1:中间分片

FO:分片内偏移,单位8字节

TTL:路由器跳数生存期

Protocol:承载协议

HC:校验和

MTU分片

MTU最大传输单元(RFC791:>=576字节)

ping命令

-f:设置DF标志位为1,不允许分片

-l:指定负载中的数据长度,使用字符填充

MF置为1 表示现在处于中间分片,Offset表示的是偏移量

分片主体:路由器、源主机

重组主体:目的主机

ICMP协议

ping命令就是调用了ICMP协议

目的告知错误、传递消息

ICMP协议是承载在IP协议之上的由类型、子类型、校验和组成

ping命令的详细格式

如果超过TTL的限制还没有到达目的服务器,就会在TTL当前到达的路由器生成TTL超限的返回报文

多播与ICMP协议

224.0.0.0到239.255.255.255 表示的是组播IP地址

组播地址与IP地址的映射关系是把低23位映射IP组播地址到以太网的地址前面25位保持不变

路由器知道组播的范围有哪些IP就需要IGMP 协议------在IP之上添加了Group Record

IPv6

更大的地址空间、跟好的多播支持

采用16进制,并且每两个字节和在一起用:分隔。还可以使用0压缩技术------还回地址位::1

IPv6的组播格式:

Scope ID填写的不同作用域也不同

其中最后24位表示的是MAC地址的最后24位------但操作系统使用了隐私加强所以导致抓包并不相同

IPv6报文格式

头部长度40个字节

Version

Traffic Class:用于流量控制

Flow Label :用于定义报文的优先级

Payload Length:负载的头部

Next Header: 把扩展首部连接起来------可以是传输层的

Hop limit :表示TTL,最大跳转数量

主首部不能分片、部分拓展首部可以分片

相关推荐
爱上妖精的尾巴3 小时前
3-5 WPS JS宏 工作表的移动与复制学习笔记
javascript·笔记·学习·wps·js宏·jsa
bing_1583 小时前
TCP的三次握⼿中为什么是三次?为什么不是两 次、四次?
网络协议·tcp/ip
屁股割了还要学4 小时前
【计算机网络入门】初学计算机网络(五)
学习·计算机网络·考研·青少年编程
屁股割了还要学4 小时前
【计算机网络入门】初学计算机网络(七)
网络·学习·计算机网络·考研·青少年编程
萧瑟其中~7 小时前
计算机网络:Socket网络编程 Udp与Tcp协议 第一弹
服务器·网络·计算机网络
lihan_freak7 小时前
计算机网络---TCP三握四挥
网络协议·tcp/ip·计算机网络
tt5555555555557 小时前
每日一题——接雨水
数据结构·笔记·学习·算法
熊猫烧竹7 小时前
【量化金融自学笔记】--开篇.基本术语及学习路径建议
笔记·学习·金融
武昌库里写JAVA9 小时前
【Redis学习】Redis Docker安装,自定义config文件(包括RDB\AOF setup)以及与Spring Boot项目集成
java·开发语言·spring boot·学习·课程设计