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的状态转换图。

拓展链接:

抓包

相关推荐
代码AI弗森5 小时前
无状态的智慧:从 HTTP 到大模型的系统进化论
网络·网络协议·http
酷熊代理6 小时前
安卓手机 IP 切换指南:告别卡顿,轻松换 IP
网络·网络协议·tcp/ip·socks5
不做菜鸟的网工6 小时前
PIM SM +MSDP 组播跨域配置案例
网络协议
大面积秃头8 小时前
Http基础协议和解析
网络·网络协议·http
软件技术员11 小时前
使用ACME自动签发SSL 证书
服务器·网络协议·ssl
我也要当昏君11 小时前
6.4 电子邮件 (答案见原书 P284)
网络协议
嶔某12 小时前
网络:传输层协议UDP和TCP
网络·tcp/ip·udp
以己之12 小时前
详解TCP(详细版)
java·网络·tcp/ip
せいしゅん青春之我13 小时前
[JavaEE初阶]网络协议-状态码
java·网络协议·http