TCP/UDP协议(浅学)

18 阅读3分钟

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的可靠的基于字节流传输层通信协议,是为了在不可靠的互联网络上提供可靠的端到端字节流传输协议。

顾名思义啊,这也是他的特点,以下来自百度:

image.png

image.png

今天主要说下tcp的工作方式,大家也都听说过三次握手,四次挥手,我现在以抓包的方式来看一下:

三次握手:

image.png

client发出SYN连接请求后,等待server回答SYN+ACK,并最终对对方的 SYN 执行 ACK 确认就行。 我们来访问一下百度,看看报文过程:

image.png

这个就是三次握手了,一旦建立成功了,就可以发送信息了,我们就能看到电脑发出的hello,现在看看第一步,发送时,客户端会把自己的同步序列号SYN置为1,序列号seq为x(随机的),比如报文的1347308416

image.png

再来看第二步,回复时,会把自己的同步序列号SYN置为1,seq置为y(随机的),确认标志位ACK为上一步的seq+1,报文为1347308417

image.png

第三步,客户端收到服务端发来的验证请求后,会使自己的seq+1,故seq=x+1,并且回复ACK请求,ACK=y+1。此时三次握手完成,可以发送数据了。

image.png

下面的图再来理解下:

image.png

四次挥手:

image.png

image.png 第一次挥手:客户端,会率先发起结束断开连接的请求:

image.png Flags:Fin位和Ack标记为1,说明这是个一个断开连接的请求的报文。此时我们不发送数据了,但是还可以接收数据。同时设置自己的序列号为seq=x,Ack为z

第二次挥手:对上一个断开连接请求的报文进行确认,Flags:Ack=1,并同时,停止接收数据。确认序号为收到的Ack=x+1,自己的seq为z

image.png

第三次挥手:服务器关闭与客户端的连接,发送Flags:FIN=1,ACK=1,序列号seq=y,ack=x+1。同时,服务器也会停止发送数据。

问:那为啥要三次,两次行不行?

答:不行,①防止重复连接。比如在网络状况比较复杂或者网络状况比较差的情况下,发送方可能会连续发送多次建立连接的请求。如果 TCP 握手的次数只有两次,那么接收方只能选择接受请求或者拒绝接受请求,但它并不清楚这次的请求是正常的请求,还是由于网络环境问题而导致的过期请求,如果是过期请求的话就会造成错误的连接;②同步初始化序列化。而如果是两次握手的话,就无法进行序列号的确认工作了,因此也就无法得到一个可靠的序列号了。

image.png

第四次挥手:是客户端对服务器断开连接请求的进行确认。发回Flags:Ack位标记为1。确认序号Ack=y+1,序列号为seq=x+1

image.png

此时,客户端也停止接收数据了。四次挥手结束。 下面的图再来总结下:

image.png

UDP 介绍与比较

UDP(User Data Protocol,用户数据报协议)是无连接的、简单的、面向数据报的传输层协议。也就是 UDP 在发送数据之前,无须建立客户端与服务端的连接,直接发送消息即可。 两者的区别:

1、TCP是面向连接的,UDP是面向无连接的;

2、UDP程序结构较简单;

3、TCP是面向字节流的,UDP是基于数据报的;

4、TCP保证数据正确性,UDP可能丢包;

5、TCP保证数据顺序,UDP不保证。