diveDylan / blog

My blog, detail is in the issues list
2 stars 0 forks source link

TCP和UDP #71

Open diveDylan opened 3 years ago

diveDylan commented 3 years ago

报文比较

UDP(伪首部共用) image TCP image

特性

UDP

1、udp是无连接的、尽最大努力交付、面向报文(不拆分不合并,一次交付一个完整报文)、没有拥塞控制、 首部开销小,通过端口实现分用,可以一对多和多对一 2、伪首部不向下和向上传递只用于计算校验和 3、udp校验是首部和数据包一起校验,通过切分成16位字符串,若非偶数位则进行补全零操作,通过二进制反码 求和

TCP

1、面向连接的传输协议,通信需要建立连接,结束需要释放连接 2、端对端的通信 3、提供可靠交付(重传,阻塞,缓存) 4、可以双向通信,服务端push 5、面向字节流

TCP报文介绍

1、端口标记分发的应用程序,实现tcp的分用功能 2、序号 seq,即报文段序号,tcp发送的字节流,字节流每个字节都按序编号,代表数据第一个字节的序号 3、确认序号(需要ACK=1)ack,期望收到对方下一个报文段的第一个数据字节的序号,也代表确认号 - 1 的所有数据都已经收到 4、数据偏移,首部长度,报文起始到数据报的起始的距离 5、URG紧急,URG=1 时紧急指针生效,此报文将优先发送 紧急指针,紧急数据的字节数,指出了紧急数据的尾部(窗口为0也可以发送紧急数据) 6、ACK, ACK=1, 代表确认应答,此时确认序号才生效 7、PSH(push) PSH = 1 TCP可以主动推送报文 8、RST(reset)RST=1 遇到特殊情况需要重建链接或者重置 9、SYN同步, SYN=1 ACK= 0请求连接报文 SYN=1 ACK=1 接受连接报文 11、窗口,通知对方允许发送的数据量,让发送方设置其发送窗口大小,与滑动窗口相关 12、校验和,加上伪首部(tcp协议号6)

TCP的一些概念

最大报文段长度MSS:

可传送的最大报文字节数

滑动窗口

三个指针:1、已经发送未确认2、允许发送未发送3、不允许发送 未按序的时候需要使用缓存包括重传的时候

超时重传

超过一段时间没有收到确认报文将重传 RTT一个报文的往返时间 RTTs 加权平均往返时间,又称平滑的往返时间 newRTTs = (1 - a) oldRTTs + a newRTT(a一般为0.125) RTTd RTT的偏差加权平均值 newRTTd = (1-y) oldRTTd + y(RTTs - newRTT) RTO 超时重传时间 RTO = RTTs + 4 RTTd

缓存

发送缓存: 准备发送的数据(累计算法)、发送过的超时重传的副本 接受缓存: 应用层未使用的数据,未按序到达的数据

SACK

Selective AXK 选择确认,报文段无差错,部分数据缺失或者无序,标志未正确收到的报文序号段

慢启动和拥塞避免

TCP慢摇和拥塞避免:先以指数形式加数,发生确认超时或者其他阻塞现象,立即减半(第一次发生在慢开始门限)再以线性形式增长逐步确认合适的最大传输值 image

TCP握手

step1

报文方向clinet =》 server

seq=x  
SYN=1 ACK=0

发起一个序号为x,SYN=1,ACK=0请求链接报文,客户端进入SYN-SENT状态

step2

报文方向server =》 client

seq=y
ack=x+1
SYN=1 ACK=1

SYN=1 ACK=1 (服务端的确认应答) seq=y ack=x+1 服务端发送的报文序号为y的报文,同事将报文的ACK标志置为1,表示接受链接, 将确认序号ack变成x+1代表序号x的报文全部正常接受(此时没有数据报)服务端进入SYN-RECIVED状态, 这一步时服务端对客户端进行应答确认

step3

报文方向client =》server

seq=x+1
ack=y+1
SYN=1 ACK=1

SYN=1 ACK=1 (客户端的确认应答) seq=x+1 ack=y+1 客户端收到确认序号x+1的报文,发送序号为x+1的报文,同时确认服务端的序号y 的报文确认应答ack=y+1,将确认应答标记ACK置为1,代表客户端确认接受服务端链接。 客户端进入 CLINET-READY, 服务端收到报文进入SEVER—READY

TCP连接释放

step1

报文方向client =》 server

seq=x 
FIN=1

FIN=1 seq=x 客户端发起一个FIN=1 序号为x的释放连接请求报文,客户端进入FIN-WAIT-1

step2

报文方向 server =》 client 这个阶段服务器将分步发送两种报文应答 a、

seq=y
ack=x+1
ACK=1

ack=x+1,ACK=1, seq=y 收到客户端序号为x的请求报文,将确认应答标志位置为1,发送序号为y确认应答为x+1的报文,此时client发送server的通道已经关闭(FIN-WAIT-2), 但是接受通道open,服务端CLOSE-WAIT,整体状态HALF-CLOSED b、

seq=z
ack=x+1
FIN=1 ACK=1

服务端确认没有发送数据后,发送FIN=1,seq=z,ACK=1 ack=x+1(客户端没有新的数据发送确认应答号一直为x+1)的释放连接请求报文,服务端进入LAST-ACK状态

step3

seq=x+1
ack=z+1
ACK=1

报文方向client =》 server客户端收到服务端的释放连接请求报文,做出确认应答,发送ACK标志为1,序号为x+1,ack确认序号为z+1的应答请求,服务端收到报文进入closed状态,客户端进入 time-wait状态,类似超时计时器的一个时间概念后关闭连接