UDP/TCP协议解析

UDP/TCP协议解析

UDP报文格式

UDP报文格式如下。

UDP首部字段有八个字节。

{ src port : dest port : len : 校验和}

1).其中len字段代表整个报文长度,16个比特位代的范围[0 --- 65,535]字节,大约为64K。

报头的长度就是保证UDP是面向数据报的原理,从缓冲区中读取数据,都可以通过头部字段的len进行一些计算,让每次从缓冲区中读出的都是UDP的整个数据报。

UDP面向数据报解析

面向数据报,及通过缓冲区读入的内容是以整个数据报为单位进行读取的。

报头的长度就是保证UDP是面向数据报的原理,从缓冲区中读取数据,都可以通过头部字段的len进行一些计算,让每次从缓冲区中读出的都是UDP的整个数据报。

TCP报文格式及字段解析

TCP报文格式如下。

1).对于源端口和目的端口,没有可讲解的。

2).序号 :在TCP连接刚建立的时候,OS会随机生成一个序号,序号 = 确认序号 + len(数据长度) - 1 ,(序号只有在存在数据时,或者在三次握手以及四次挥手的SYN段,RST段,FIN段时才有意义 )。

3).确认号 :确认号代表在该号之前的所以数据都以及收到,确认号 = 收到的序号 + 1

4).数据偏移 :该字段只有4位,范围为[0,15],其代表了整个报头的大小,但是该大小只是一个数字,确定的大小需要在该大小上 * 4。

5).6个标志位 :URG=紧急指针,ACK=确认位,PSH=快速交付位,RST=重新设置,SYN=同步位,FIN=终止位,这六种比特位,会在以下介绍。

6).窗口 :该字段是用来进行流量控制的主要字段,其表示的是接收窗口剩余字节数量。

7).校验和 :用于校验整个TCP数据报是否有错误。

8).紧急指针 :紧急指针用于指向TCP数据字段中的某个位置,该紧急指针的长度为一个字节,让该位置的字节会被上层优先获得,从而判断接下来该怎么办。

TCP面向字节流解析

面向字节流,及在传输过程中,报文和报文之间没有明显的分割,对于发送端来说,发送的数据是一个一个字节,对于接收方来说,接收的也是一个一个字节,所以接收方通过接口接收到的数据可能并非是一个完整的报文。

TCP三次握手/四次挥手解析

TCP建立链接是通过三次握手来实现的,TCP三次握手示意图如下。

1).首先,服务端调用Listen 接口,服务器阻塞在Listen接口处,进入LISTEN 状态,等待客户端建立链接。

2).其次,先生成随机确认号,同时客户端调用connect接口发送SYN报文 ,此时客户端进入SYN_SENT 状态。

3).在服务端接收到SYN 报文,同时服务端发送SYN | ACK 报文,此时服务端处于SYN_RECV 状态。

4).随后客户端发送ACK 报文,此时客户端的链接以及建立成功。

5).最后,在服务端收到ACK 报文后,此时服务端的链接建立成功。


TCP四次挥手示意图如下。

1).首先,由主动关闭通信的一端发送FIN 报文,同时进入FIN_WAIT-1 状态。

2).其次,在被动关闭端收到FIN 报文后,进入CLOSE_WAIT 状态,在CLOSE_WAIT 状态中,被动关闭端会将缓冲区的所有数据都发送到网络中

3).再次,缓冲区的数据发送到网络中后,被动关闭端会发送FIN | ACK 报文,同时被动关闭端进入LAST_ACK 端。

4).主动关闭端 收到FIN | ACK 报文后,主动关闭端发送ACK 报文,主动关闭端进入TIME_WAIT 状态,该状态需要两个MSL时间。

2MSL 时间中,是为了让主动关闭端等待CLOSE_WAIT状态中发送的报文到达主动关闭端。

同时关闭socket。

5).被动关闭端 在接收到ACK报文后,被动关闭端关闭socket。

TCP为什么需要三次握手

TCP是面向链接 的传输,同时TCP是全双工 通信,所谓的面向链接,并不是真正的建立链接 ,该链接只是抽象的链接,同时需要帮助TCP的全双工通信这就要求服务端能收到客户端的报文,同时客户端能收到服务端的报文 ,而当客户端收到SYN | ACK 报文后,客户端的链接就已经建立完毕,当服务端收到ACK 后,服务端的链接就已经建立完毕,就已经保证了面向链接以及全双工这两种特点。

TCP为什么要四次挥手

由于TCP是面向链接全双工的,四次挥手的目的是为了关闭双方的通信链接(抽象链接),所以,主动关闭方发送FIN报文,被动关闭方发送ACK报文,关闭一条链接,随后被动关闭方发送FIN | ACK报文,同时主动关闭方发送ACK报文,关闭一条链接,自此两条链接被关闭。

三次握手和四次挥手特点

如图。

在TCP中,存在一种叫做捎带应答 的机制,及需要发送ACK报文只需要将报头的ACK位制为1即可,但是TCP的数据部分却没有被设置,所以我们将多种状态信息或数据信息 都装载在同一个TCP报文中发送出去就是捎带应答

所谓的三次握手,实际上就是将ACK报文SYN报文 这两种状态信息都放在一个TCP报文中,捎带应答了。

实际上可以将SYN和ACK分开,分开后,所谓的三次握手 本质就是四次握手 了。

相关推荐
掘根9 小时前
【网络】高级IO——poll版本TCP服务器
网络·数据库·sql·网络协议·tcp/ip·mysql·网络安全
友友马10 小时前
『 Linux 』HTTP(一)
linux·运维·服务器·网络·c++·tcp/ip·http
2401_8725149710 小时前
深入探究HTTP网络协议栈:互联网通信的基石
网络·网络协议·http
weixin_6320776312 小时前
udp聊天室
udp·网络编程·嵌入式·编程·聊天室
不良人天码星12 小时前
HTTP 协议的基本格式
网络·网络协议·http
月临水13 小时前
JavaEE:网络编程(UDP)
java·网络·udp·java-ee
广东数字化转型14 小时前
SSL/TSL 总结
网络·网络协议·ssl
许野平14 小时前
Rust: Warp RESTful API 如何得到客户端IP?
tcp/ip·rust·restful·ip地址
不烦下雨c15 小时前
【网络】传输层协议TCP
网络·网络协议·tcp/ip