tcp、udp ゝ一世哀愁。 2023-07-18 09:47 15阅读 0赞 ### tcp ### 传输控制协议,传输层协议。通过建立连接,后再传输数据,通过连接实现了流量控制、数据有序性、数据可靠性(丢失重传)等特性。但是因为需要维护连接所以效率偏低。需要维护半连接队列和全连接队列。 ### udp ### 用户数据报协议。不需要建立连接,直接将数据报发给接收端,存在出现丢包,数据无序,无法控制流量等问题。传输效率高。数据包小,包头字节数少。 #### tcp和udp区别 #### <table> <thead> <tr> <th>Tcp</th> <th>udp</th> </tr> </thead> <tbody> <tr> <td>可靠性高</td> <td>不可靠</td> </tr> <tr> <td>支持流量控制</td> <td>不支持</td> </tr> <tr> <td>全双工</td> <td>全双工</td> </tr> <tr> <td>面向连接</td> <td>无连接</td> </tr> <tr> <td>有连接</td> <td>无连接</td> </tr> <tr> <td>有序性</td> <td>不保证有序性</td> </tr> <tr> <td>传输效率低</td> <td>传输效率低</td> </tr> <tr> <td>Telnet、FTP、SMTP</td> <td>NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议</td> </tr> <tr> <td>报文头部最小20字节</td> <td>报文头部8字节</td> </tr> </tbody> </table> ### tcp报文 ### **1 源端口和目的端口** 既发送方的ip和接收方的ip **2 序号和确认序号** 序号为当前报文中传输的数据首字节的序号 ,确认序号则是下一个期待接收的数据的字节序号,比方发送方序列号是1000,数据字节数是100,那么接收方确认序号则为1100。只有控制位ACK=1时确认序号才有效 **3 数据迁移/ 首部长度** 由于头部包含可选内容,所以头部的长度是不确定的,不包含任何可选字段则长度为20字节,首部长度是占4位,单位为32位字,既1代表32/8 既4个字节,所以默认为 1001,由于只占4位,最大为1111,既最大占15\*4=60字节,所以头部的大小为20-60字节 **4 保留位** 占6位,保留为今后使用,目前置为0 **5 控制位** 用于标识请求的目的,需要哪个控制位就将该控制位设置为1,控制位不能都是0. 1. SYN(synchronous) 建立连接时使用的控制位,第一次握手SYN=1,表示建立连接并传输初始序号seq,tcp规定SYN=1不能携带数据,但是要消耗一个序号。 2. ACK(acknowledgement ) 确认序号,当ack=1时确认号才有效,第二次握手ACK=1,SYN=1,当连接建立后ACK=1一直成立。 3. PSH(push) 用于提高传输效率,tcp接收端如果接收到的数据该控制号为1,即表示接受到的数据不用等到接收缓冲区满,直接将数据交给应用程序。 4. FIN(finish) 表示发送方已经没有数据要传输了,用于释放连接。 5. RST(reset) 用于重置tcpl连接,可以通过该标志位用于拒绝一个无效的数据段或者拒绝一些连接请求,如果接收到的数据包含该标志位,则表示当前的接收端的请求可能有问题。 6. URG(urgent) 紧急指针,用于保证tcp连接不中端,中间设备接收到该数据需尽快处理。 **6 窗口** 用于告诉另一端接收端缓存大小,以此来控制发送端的发送速率,达到流控的目的。窗口大小是一个16位的字段,因此最大为65535 **7 紧急指针** 仅当紧急指针控制位URG为1时有效,紧急数据会放到报文段数据的最前面,而紧急数据后面的数据依然是普通数据,紧急指针是一个偏移量,序号加上偏移量既为紧急数据的最后一个序列号 **8 效验和** 用于校验首部和数据两个部分,由发送端计算和存储,接收端进行校验。占2个字节。 **9 选项字段** 最常见的选项字段就是“最大段大小”选项,称为MSS。用于指定当前端接收的报文段的最大值。 **10 数据** 1-9为报文头部内容,剩下的部分则为实际传输的数据。 #### udp报文 #### 1. 源端口 16位 2. 目的端口 16位 3. 长度 16位。包含头部长度加上传输的数据长度 4. 校验和 16位.校验udp头部和传输数据的正确性。 #### tcp建立连接为什么三次握手? #### 为保证可靠传输,提高传输效率采用三次握手建立连接,确定双方接收能力和发送能力正常,传输为后面可靠传输数据用的初始序列号。交换tcp窗口大小。 **原理** Tcp三次握手是为了交换双方传输的数据的原点序列号。建立连接时双方都会随机生成一个32位数作为数据传输的起点序列号,之后的数据传输连接双方传输数据都会对每个字节进行编号并传输(编号以建立连接时生成的序列号为起点递增),从而让接收放知道数据是否合法,比如初始序号是1000,序号是900就是非法的。并且消息接收方还可以对发送方的数据进行确认,比如a发给b的初始号需要是1000,b回复a时的确认序号是2001,代表序号为1000-2000的数据已经被b正确接收了。 **序列号生成** 基于双方ip和端口进行md5运算,再加上本机的计时器当前计数,这个计数4毫秒自增1 **三次握手完整过程** 1. 第一次握手a把初始序号(比如1000)传给b。SYN=1,seq=100 2. 第二次握手b确认接收回复确认序号(1001表示编号1000的字节数据已经收到),并带上b的初始序号2000传输给a。SYN=1,ACK=1,ack=1000+1,seq=2000。(大写ACK为控制位,小写ack为确认序号) 3. 第三次握手a根据b的初始序号seq 2000+1=2001做为确认序号传输给b表示正确接收了序号为2000的字节数据。 通过三步保证了双方都正确接收到对方的初始序号,并保存在双方本地。ACK=1,ack=2000+1。 第一次传输的初始序号seq又称为ISN(Initial Sequence Number) ,初始序列号。 **为什么不是4次或者2次** 通过三次就可以交换。如果是4次,可以将b确认序号和传输初始序号分成两步,就会变成4步,但是可以省略掉一次传输进行合并。如果是2次,把a确认收到b的初始序号省略掉,可能会导致b传给a的初始序号丢失,那么传输数据两边记录的b的序列号就不一致,数据传输就会有问题。 通过同步标志位SYN传输各自的初始序列号ISN,占用一个字节,因为tcp要求传输有数据的tcp segment传输数据要有确认,所以交换序号也要有确认序号,确认序号即为ACK。连接建立过程不能携带数据,即SYN=1是不能携带数据的,否则没有tcp连接的流量控制,会导致接收方接收过多数据,耗费接收方空间去接受这些数据。 **三次握手某一次失败会怎么样** 第一次握手,a传给b的syn中途丢失没有到b,a会周期性会超时重传,直到收到b的确认 第二次握手,b发给a的syn+ack中途丢失,没有到达a,b会周期性超时重传,知道收到a的确认。 第三次握手,a发给b的ack中途丢失,没有到达b,这时a认为tcp已经established建立成功,而b则认为tcp还处于Active状态,没有建立完成连接。 此时会出现三种情况 1⃣️ 双方建立连接后,没有数据要传输,b会周期性的超时重传,直到收到a的确认,收到确认后b也认为tcp连接处于established状态,双方都可以传输数据 ② a发送数据和ack给b,b收到a的数据后将tcp状态切换为established。双方可正常传输 ③ b如果要传输数据,跟第一种情况一样,进行超时重传直到收到回复 **半连接队列** 服务端接收到连接请求后,会处于SYN\_RCVD状态,即还没建立连接完成的连接,会被存放到一个队列中。连接如果有异常,导致重传,重传的间隔是指数增长,如果重传次数超过最大重传次数则不会再重传。 **全连接队列** 已经建立连接完成的则会放入该队列,如果队列满了,可能会导致连接丢失。 #### 滑动窗口 #### 26 滑动窗口 发送端和接收端都有一个发送窗口 发送端的数据分为几种情况 ① 已经被接收端确认的数据 这些数据在窗口外 ② 已经发送还没被确认的数据 在窗口内 ③ 确认可以发送,还待发送的数据,既接收端返回的窗口大小范围内的数据。属于发送端窗口内的数据。 ④ 还没发送。超过接收端接收缓冲区大小的数据。窗口外。 接收端的数据 ① 已经接受到的数据,还没被应用程序接收 ② 已经被接收并被应用程序获取,但是还没发ack包 ③有空位,还没发送的数据 滑动窗口保证了数据有序性到达,且可以控制发送效率。如果后发数据 a 先到,会先存到接收缓冲区,等到前面数据b 到了之后再ack确认ab,发送端的窗口中的ab包被确认后才移出窗口。发送端根据接收端返回的数据包动态更改窗口大小,如果接收端接收慢,数据都停在缓冲区内,导致满了,则接收端会告知发送端窗口大小为0。发送端会停止发数据,直到接收端缓冲区有空间,重新发送ack指定窗口大小,发送端继续发数据。 滑动窗口从已存在窗口的数据,向待入窗口的数据滑动,接收端通过返回窗口大小控制发送端处理效率 发送窗口大小除了收到接收窗口影响,还受到拥塞窗口影响 避免死锁:如果发送方接受到确认窗口为0,则停止发送数据,当接收方重新发送窗口大时报文丢失,会导致发送方一直处于等待状态。因为发送方当接收到窗口大小为0后,会启动一个定时器,定时询问窗口大小,如果还是为0则继续等待。 -------------------- #### 拥塞控制cwdn #### 拥塞窗口的单位是字节数 ##### 拥塞控制的方式: ##### **慢启动、拥塞避免** 流量控制是点对点的控制,拥塞控制是全局性的控制,在网络上的网络资源如处理机、带宽、交换节点的缓存等过载时,通过发送窗口控制发送数据速率,防止注入过多的数据到网络上。拥塞窗口的大小取决于网络中的拥塞情况。 \*\*慢开始算法:\*\*先探测网络环境,拥塞窗口一开始设置为1,然后每经过一次传输确认,则倍数增长 \*\*拥塞避免算法:\*\*拥塞窗口每经过一次传输确认,窗口大小则增加1。 **ssthresh状态变量** 为避免传输增长速度过快,当窗口大小超过ssthresh,慢开始切换为拥塞避免。当等于ssthresh则两个算法任意。 无论处于哪个阶段,如果判断当前网络拥塞,既发送的数据没有收到确认,则会把ssthresh设置为出现拥塞时窗口大小的一半,窗口大小重设为1,启用慢开始增长。因为拥塞控制,如果附近使用网络人员过多网络会变差,慢算法在下载东西时速度逐渐增长也可以体现 **快重传、快恢复** **快重传** 当接收方收到一个失序的报文时,会发起重复确认。比如发送方发送序列号为1 2 3 4的数据,当2丢失,而3到达时,接收方会重复确认1,而4到达时2还是没收到,会继续重复确认1。 发送方一旦接受到三个重复确认则要直接重传 丢失的报文,不用等重传计时器时间到期。 **快恢复** 收到三个重复确认后,为了预防拥塞,发送方会将拥塞窗口设置为当前ssthresh值的一半,ssthresh也减半,然后采用拥塞避免算法。 -------------------- #### 定时器 #### **1 )建立连接定时器** tcp发起建立连接时,会启动连接定时器,如果超过3秒还没收到确认就会重新发起连接,重新启动定时器,时间变为6秒 **2)重传定时器** 发送端发送数据后会启动重传定时器,在规定时间内没有收到确认则会重新传输数据。避免报文丢失。接收端接受到失序的数据也不会交给进程。 **3)延时应答定时器** 接收端接受到数据,不立马应答,而是启动定时器,200ms内如果接收端有数据发送,则会捎带确认信号,如果超过200ms还没有数据发送,则才会发起确认。 **4)保活定时器** 如ftp连接的场景,可能存在只建立连接,不传输数据的情况,服务端会启动一个定时器,2小时内都没传输数据,则每隔75秒发送一个探测报文到客户端,如果超过10次都没有收到应答,则认为客户端异常,关闭连接。 #### tcp断开连接为什么四次挥手? #### 第一次挥手: 客户端发出FIN报文,即控制位FIN=1,seq=x,客户端进入FIN\_WAIT1状态,等待服务端确认。 第二次挥手: 服务端可能数据还没发完,所以不会立刻关闭连接,所以会先发一个确认报文,即控制位ACK=1,seq=u,ack=u+1。客户端进入FIN\_WAIT2状态,等待服务端关闭连接。此时tcp处于半关闭状态,服务端处于CLOSE\_WAIT关闭等待状态。 第三次挥手: 服务端数据发完了,也要开始断开连接了,此时服务端发送FIN报文,即FIN=1,ACK=1,seq=w,ack=x+1,服务端进入LAST\_ACK状态。 第四次挥手: 客户端接收到后,发一个确认报文,即ACK=1,ack=w+1,并进入TIME\_WAIT状态,需要经过时间等待计时器等待2MSL后,客户端才进入CLOSE状态。 **为什么是四次,不是三次?** 因为服务端回复客户端的连接关闭请求时,数据可能还在处理,所以要先发个确认信号,等待数据发完了才发送关闭信号。如果不先确认,客户端可能会超时重试重发关闭请求。 **为什么要进入TIME\_WAIT状态和等待2MSL** 因为第四次挥手可能会发送丢失,为了确保关闭信号能够正确到达服务端,需要进入TIME\_WAIT状态,而不是直接关闭连接。如果服务端没有接收到确认信号,会重新发送FIN+ACK报文,客户端再TIME\_WAIT状态收到该信号,会再重传一次确认,重新启动时间等待计时器。2MSL后没有收到该信号,则会正常关闭连接。如果不等2MSL直接关闭连接,会导致服务端如果丢失了ack报文,则连接无法正常关闭。 MSL为最长报文段寿命,即报文在网络上存在的最长时间,2MSL可以确保服务端没收到确认信号时重发的关闭信号可以到达客户端。 #### SYN攻击,ddos攻击 #### 通过伪造大量不存在的ip,不断向服务端发送SYN包,服务端则回复确认包,由于ip不存在,所以服务端会不断重发直到超时,这些伪造的SYN包会长时间占用未连接队列,导致正常的SYN包请求因为队列满了而被丢弃,从而引起网络拥塞和系统瘫痪。SYN攻击是典型的ddos攻击。 **检查是否被攻击** linux通过netstat可以看到网络连接的状态,如果有很多SYN\_RECV状态的连接,可能就是被攻击了。 **防御SYN攻击的方式** 缩短超时时间,增加最大半连接数,过滤网管防护、SYN cookies技术。
相关 图解TCPIP---第六章---传输层TCPUDP 哈哈哈哈哈哈哈哈 `TCPIP识别一个进行通信的应用需要5大要素` 源IP地址 目标IP地址 源端口 目标端口 协议号 ------ ╰半橙微兮°/ 2023年07月04日 08:47/ 0 赞/ 149 阅读
还没有评论,来说两句吧...