TCP协议与UDP协议
Posted 歆修
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP协议与UDP协议相关的知识,希望对你有一定的参考价值。
UDP协议
无连接
尽最大努力交付
面向报文
无拥塞控制
支持一对一、一对多、多对一和多对多的交互通信
首部开销小
首部占8字节
用户数据报有两个字段,数据字段和首部字段。
1)源端口 源端口号,需要对方回信时使用,不需要可以全0
2)目的端口 目的端口号,在终点交付报文时必须使用
3)长度 UDP用户数据报的长度,最小位8(仅有首部)
4)检验和 检验UDP用户数据报在传输过程是否有错
TCP协议
面向连接;通信之前必须建立连接
每一条TCP连接只能是点对点的(一对一);
提供可靠交付的服务;通过TCP连接传输的数据,无差错,不丢失,不重复。
提供全双工通信;
面向字节流。虽然程序和TCP交互是一次一个数据块,
但是Tcp把应用程序交下来的数据看成仅仅是一连串的无结构的字节流
1)源端口和目的端口各占2字节
2)序号 4字节。
3)确认序号 4字节
上一个字段的序号是对数据的编号,所以确认序号是下一个期望接收的TCP分段号,
相当于是对对方所发送的并且已经被本方所正确接受的分段的确认。仅当ACK标志为1时有效。
确认号表示期望收到的下一个字节的序号
4)4位的报头长度(数据偏移)
以32位(4字节)字长为单位,需要这个值是因为任选字段的长度是可变的。
跟IP头部一样,以4字节为单位。最大是60个字节。不存在任选字段正常的报头长度是20字节。
其实相当于给出数据在数据段中的开始位置。
5)保留位,6位,必须为0
6)标志位,占有6个比特位,他们中可以有多个位置为1,依次为:URG,ACK,PSH,RST,SYN,FIN。
URG:该位为1说明表示TCP包的紧急指针域有效,用来保证TCP连接不被中断,并督促上层应用敢快处理这些数据。
ACK:确认号有效
PSH:接收方应尽快将这个报文交给应用层,叫做push。所谓Push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队。
RST:连接复位,复位因主机奔溃或其他原因而出现的错误连接,也可以用于拒绝非法的分段或拒绝连接请求,这个用处还是比较多的
SYN:是一个同步序号,通常与ACK合用用来建立连接。也就是常说的三次握手
FIN:既然有建立连接那么必然有拆除连接,这个字段表示发送端已经达到数据末尾,也就是说双方的数据传送完成
7)紧急指针
8)窗口大小
TCP的流量控制由连接的每一端通过声明的窗口大小来提供。
窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。
这是一个16 bit字段,因而窗口大小最大为65535字节。
9)检验和 用于对分段首部和数据进行校验。正常情况下为一定为0
网络拥塞
为了避免之间传输大量数据引起网络拥塞;因此先探测,由小到大来增加发送窗口。
1)慢开始为指数性增长,到达阈值之后,使用拥塞避免,即线性增长(加法增大)
2)直达阻塞,这时会将阈值置为当前窗口的一半,然后采用“乘法减小”, 从新阈值开始 ,使用“加法增大”传输
重传机制
超时重传即数据因网络拥塞或者丢失原因,
导致接收方没收到数据,则无法为发送方返回确认超过这段时间,发送方重新发送这条数据,等待接收方的确认
三次握手
(1)第一次握手:
客户端将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给服务器端,
客户端进入SYN_SENT状态,等待服务器端确认。
(2)第二次握手:
服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,
ack=x+1,随机产生一个值seq=y,并将该数据包发送给客户端以确认连接请求,
服务器端进入SYN_RCVD状态。
(3)第三次握手:
客户端收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,
并将该数据包发送给服务器端,服务器端检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,
客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
四次挥手
(1)第一次挥手:
客户端将标志位FIN=1,seq=u,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。
意思是说"我客户端没有数据要发给你了",但是如果服务器端还有数据没有发送完成,
则不必急着关闭连接,可以继续发送数据。
(2)第二次挥手:
服务器端收到FIN后,先发送ack=u+1,告诉客户端,你的请求我收到了,但是我还没准备好,
请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
(3)第三次挥手:
当服务器端确定数据已发送完成,则向客户端发送FIN=1,seq=w报文,告诉客户端,
我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
(4)第四次挥手:
客户端收到FIN=1报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,
所以发送ack=w+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。
服务器端收到ACK后,就知道可以断开连接了。
客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,客户端也可以关闭连接了。
最终完成了四次握手。
为什么是三次握手和四次挥手
为什么第四次挥手客户端要等待2MSL之后才到Close状态
TCP如何保证数据的可靠性
检验和
序列号
确认应答机制(ACK)
超时重传机制 ---- 快重传
连接管理机制
拥塞控制
流量控制
以上是关于TCP协议与UDP协议的主要内容,如果未能解决你的问题,请参考以下文章