TCP的三次握手和四次挥手

整理一点自己的笔记上来:

笔记:

我们都知道TCP和UDP都是传输层的协议。

前者相当于打电话,是基于连接的,后者相当于写信,根本不知道是否丢包了,是否缺了一页。

TCP的三次握手+四次挥手+传输确认保证了它的基于连接。

Acknowledgment Number中文为确认序列号,简称ack。是TCP报文中的一部分。

一个TCP报文包含太多,有32bit的seq也就是这个包的序号,还有32bit的ack,也就是确认序号。还有好多标志:FIN,ACK(这个和ack不是一个东西),SYN等。

A发送一个TCP包,其中SYN=1,序号seq假设为x,B回复的TCP报文中ACK=1,序号ack为x+1,SYN=1,序号码seq=y。此时A再回复一个TCP报文,其中ACK为1,ack为y+1,seq=x+1 共三次操作,对应三个TCP包,所以叫做三次握手。(我们常常说的SYN包就是一个TCP报文,SYN标志为1。按照上述写的更好理解)。

例子:A发送了SYN包,但是由于在中间节点的滞留,对方无法回复,他以为SYN包丢了,所以重新发了一个SYN包,B收到一个SYN包之后回复了一个ACK+SYN包,连接建立成功。结果此时滞留的SYN包到达B,B会查看连接表(位于内核的网络栈),发现连接已经建立(当 B 收到 SYN 包时,内核会解析出 IP 和端口信息,并与连接表中的现有条目进行比对,以判断是否已经建立了连接。),所以会忽略掉这个SYN包。有一种情况,B发送了回复之后,他也不知道这个包A收到没有,此时它可能会以为连接已经建立,但实际没有,A还以为自己的SYN包丢了,导致A重发。

连接表记录了源IP源头端口+目的IP目的端口。怎么记录的?TCP中没有IP啊。答:

IP 报文(网络层):在 TCP 报文被封装在 IP 数据包中时,源 IP 和目标 IP 是在 IP 头部中携带的。操作系统可以从 IP 头中获取源 IP。

TCP 头部:TCP 报文中包含源端口和目标端口,操作系统在处理 TCP 报文时会将源 IP、源端口、目标 IP 和目标端口一起作为连接的唯一标识。

四次挥手:A如果close,则向B发送TCP报文,其中FIN标志为1,seq=u,B收到后回复TCP报文,其中ACK=1,ack=u+1,seq=v; B此时执行了close之后发送TCP报文,FIN标志为1,seq=w,ack=u+1,ACK标志位为1。A回复TCP报文,ACK标为1,ack=w+1,seq=u+1。注意A在发送了ACK之后它进入timewait状态,防止它后边发的这个包丢失B收不到。

TCP报文是有序列号的,发送方发送TCP报文之后,如果一切没问题,对方会回复下一次期望收到的数据。

seq是序列号的意思,占用TCP报头中的32bit。TCP报头除了序列号还有几个标志位,SYN FIN ACK这些都是标志位。

图片:

上图为TCP头部。

上图中:上面为三次握手,下面为四次挥手。

上图为wd书中的三次握手图。互相结合着看。

上图为wd书中的四次挥手图。

上图为TCP的状态转换图。

拓展链接:

抓包

相关推荐
2401_894915539 小时前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
SilentSlot14 小时前
【C/C++】手写 DPDK 协议栈(十一):基于 PPS、SYN 比例和源 IP 熵的 DDoS 检测
c语言·c++·tcp/ip
Shell运维手记15 小时前
ARP 协议超详细讲解(适合网工考试 / 运维理解)
运维·网络·网络协议·智能路由器
ShineWinsu16 小时前
对于Linux:HTTP中cookie、session的解析
linux·网络·c++·网络协议·http·cookie·session
huainingning17 小时前
华三瘦AP切换为胖AP并配置无线功能
运维·网络·网络协议·tcp/ip
Rotion_深19 小时前
C# 设计TCP Server
开发语言·tcp/ip·c#
跨境技工小黎20 小时前
4G/5G 移动代理实战:什么时候必须用移动 IP?
网络协议·tcp/ip·5g
米尔的可达鸭20 小时前
UDP 通信深度实验:从 Windows FastPath 到 ICMP 端口不可达的完整排查
windows·websocket·网络协议·rust·udp·wireshark·tcpdump
SilentSlot1 天前
【C/C++】手写 DPDK 协议栈(十二):TCP 并发与自实现 epoll 的就绪事件分发
c语言·c++·tcp/ip
SilentSlot1 天前
【C/C++】手写 DPDK 协议栈(六):TCP 三次握手、状态机与数据回显
c语言·c++·tcp/ip