浅析tcp与udp

简介

TCP与 UDP是网络体系中传输层常用的协议,传输层的主要作用是提供应用进程间的逻辑通信。计算机之间的通信实际上是主机上不同应用进程间的数据交换。以用户浏览网页为例,
应用层提供的是应用间的交互要求,即提供了需要交互的应用进程和需要交换的数据。下面的网络层提供的是数据报文段分组分包和路径选择。那么中间的传输层需要做到的就是对于参与传输的对象和数据进行一个确认和包装处理。
事实上传输层的作用主要有以下几点;
为应用进程间提供端到端的逻辑通信,
对收到的报文进行差错检测,
提供应用进程发送过程中传输协议的”复用“和数据取出首部后的“分用”。

1、TCP基本特点

  1. TCP是面向连接的传输层协议;即应用程序在使用该协议前需要建立TCP连接。在数据传输完毕后,必须释放已经建立的连接。
  2. TCP连接只能是点对点的;即只能是一对一。
  3. TCP提供可靠交付;通过TCP传输的数据无差错、不丢失、不重复、不重复、按序到达;
  4. TCP提供全双工通信;TCP允许通信双方的应用进程在任何时候都能发送数据。
  5. 面向字节流。指流入到进程和流出到进程的流为字节流。

2、UDP基本特点

  1. UDP面向无连接的,发送数据不需要建立连接。
  2. UDP不保证可靠交付,总是尽最大努力交付数据。
  3. UDP是面向报文的,对于发送方的报文,UDP会添加首部后就向下交付。
  4. UDP支持一对一、一对多、多对多;
  5. UDP资源花销相对于TCP较小只有8字节,而TCP需要20字节以上。

3、UDP详解

UDP的首部组成:源端口,目的端口,长度,校验和。
每个字段的长度都是两字节,一共8字节。直接加载UDP的数据段前面。
UDP的校验和计算:通过在数据包前面加上12位伪首部实现,
发送方,给校验和部分放入全零字段,如果用户数据部分不是偶数个字节,再多加一个零字节,随后将整个首部加数据进行二进制反码计算,写入校验和,发送(不包括添加的字节)。
接收方,直接验证首部加数据部分的16位进制反码,检查结果是否为全1。

4、TCP详解

TCP首部

源端口和目的端口各2字节,主要用于实现分用功能。
序列号:4字节范围是[0,2^32-1],用于保证报文在字节流里的位置,比如一个报文段是300,大小为100,则下一个报文段序号为400;
确认号:4字节,是期望下一个报文的序列号,比如A收到B的报文序列号为400,数据包大小200,则再A收到后确认包里确认号为600;
数据偏移:4位,用于记录TCP传输实际的数据偏移了多少,即记录了首部的大小。
保留字:6位,留作以后控制位使用,初始为0;控制位:紧急标识URG\立即推送PSH\复位标识RST\确认ACK\同步位SYN用于搭建连接\终止FIN用于释放连接
窗口:2字节,存储从确认号其允许发送的数据量,指出接受窗口
校验和 2字节检验首部和数据
紧急指针 2字节指出紧急传输时的数据量
上述固定20字节,
时间戳:10字节,时间戳值和时间戳送回时间答字段。
此外还存在选项这种首部段,用于提高效率而进行填充的MSS,需要保证足够大,加上ip首部后不需要再进行分段,

TCP的可靠传输原理

在这里插入图片描述

滑动窗口
在这里插入图片描述

流量控制
在这里插入图片描述

拥塞控制
在这里插入图片描述

TCP建立连接和释放连接

三次握手

第一次握手时,建立连接时,客户端发送syn到服务器,
并进入SYN_SENT状态,等待服务器确认,syn同步序列编号
第二次握手:服务器收到syn包,确认客户的syn,同时自己也发送一个syn包,
即syn+ack,此时服务器进入syn_recv;
第三次握手:客户端收到包,向服务器发送确认ack,
包发送完毕后进入established状态完成握手;

两次握手不行的原因:不使用三次握手,则再服务端发出第确认包时就建立了连接。
如果客户端出现数据发送延时,会出现服务端重复发送确认,而客户端不予处理的情况,
浪费资源。其次如果第二次建立失败后,客户端会重复发送连接请求而忽略服务端的其他数据包。
只等待连接确认,而服务端则以为连接建立好,数据未发送完成,重复发送数据。

二次握手后服务端存在的半连接状态队列下,如未收到客户端确认会出现多次重传,
超过最大次数就会从队列中删除这个客户端请求。每次等待时间,一般是1,2,4,8s;
ISN初始化序列号是随时间变化的。每4ms+1;目的在于防止再网络中被延迟的分组再以后被重新发送,
而导致另一方的错误回应。
前两次握手不可以携带数据。第三次可以,原因是连接尚未建立完全,不确定各能力是否正常,
其次可能会使外部攻击造成更多的麻烦,比如在未建立连接时疯狂发送数据使服务端难以处理。
在半连接状态下有太多的syn等待确认即SYN洪范攻击。是一种典型的DOS/DDOS攻击。

套接字用于是服务端保持操作,如socket分配文件描述符,bind绑定,connect建立连接请求。

四次挥手

建立一个连接需要三次握手,而终止连接需要四次挥手,原因是因为tcp的半关闭状态导致。
半关闭是由于tcp提供了连接的一端再结束他的发送后还能接受另一端数据的能力;
tcp的连接拆除需要发送四个包:刚开始大家都处于Established状态,客户端发送关闭请求后的过程如下:
第一次挥手:客户端发送一个fin报文中会指定一个序列号。此时客户端处于FIN_WATI状态;
即发出连接释放报文段,并停止再发送数据,主动关闭TCP连接,进入等待服务端确认。
第二次挥手:服务端收到fin后,会发送ACK报文;且把客户端的序列号只加一作为ACK报文的值。
表明已经接受到客户端的报文,此时服务器处于CLOSE_WAIT状态。
即服务器发出确认报文段,服务端进入关闭等待状态。此时tcp处于半关闭状态;客户端到服务端的连接释放:
第三次挥手:如果服务端也需要断开连接,发送fin报文并并指定报文序列号,此时服务器LAST_ACK的状态。
服务端没有要向客户端发出的数据,发出连接释放报文段,服务端进入最后确认状态。等待客户端确认。
第四次挥手。客户端收到fin后一样发送一个ACK作为应答。
且把服务端的序列号值作为自己ACK报文的序列号值。此时客户端处于TIME_WAIT状态。
需要经过一段时间以确保服务端收到自己的ACK报文才会进入CLOSEd状态,
服务端收到ACK就进入close关闭状态。客户端需要等待2MSL的事件后进入关闭状态。

为什么时三次握手四次挥手:
因为当服务端收到客户端的请求报文后,可以直接发送syn+ack报文,其中ack用于应答,
syn用于同步。但是关闭连接时,当服务端收到fin报文后,
很可能并不会立即关闭socket,所以先回复一个ack,等数据发完后再进行fin;

为什么需要2msl:
两边握手完毕后,可能存在有一个ack丢失;所以time_wait状态用于等待重发可能丢失的ack报文。
用于保证最后一个ack报文能够到达服务端,如果服务端接受失败会在发送过来fin-ack,
客户端就会重新启动计时器,再重复发送确认。二是防止已经失效的连接请求报文段出现再本链接中。

建立连接后如何处理故障:建立连接后给连接加上时效两小时,在此时间段如果未收到数据包则会关闭连接

5、应用场景总结

TCP应用场景
当对网络通信质量有要求时,比如:整个数据要准确无误的传递给对方,这往往对于一些要求可靠的应用,比如HTTP,HTTPS,FTP等传输文件的协议,POP,SMTP等邮件的传输协议。常见使用TCP协议的应用:qq文件
UDP 应用场景
对当前网络通讯质量要求不高的时候,要求网络通讯速度尽量的快,这时就使用UDP,日常生活中常见使用UDP协议:QQ语音,QQ视频

Guess you like

Origin blog.csdn.net/qq_44830792/article/details/120980020