目录
上课喵:
TCP(Transmission Control Protocol,传输控制协议)的状态迁移图
TCP连接的状态迁移图
状态迁移说明:
注意:
big_htonl.c 字节序转换
addr.c IP地址的转换
作业喵:
01:OSI模型有哪些层?TCP/IP模型有哪些层?他们之间的对应关系是怎样的?
02:TCP协议如何保证数据的可靠传输?
03:为什么TCP需要三次握手?两次握手为什么不行?
04:TCP断开连接时为什么是4次挥手?为什么主动断开的一方要经历TIME_WAIT状态?
TAS:编辑
05:一般情况下,在Windows上如何抓包呢?请给出使用方法,并截图抓取QQ消息的演示结果
06:什么是大端模式和小端模式,什么是主机字节序和网络字节序?编写代码,验证一下自己的机器是大端模式还是小端模式?
TAS:
补:
01:出现大量TIME_WAIT状态怎么处理
02:2MSL
爬东西只能明天了喵
上课喵:
TCP(Transmission Control Protocol,传输控制协议)的状态迁移图
这图别看,会瞎(不是人画出来的喵!!!!)
TCP(Transmission Control Protocol,传输控制协议)的状态迁移图描述了TCP连接在不同阶段的状态变化及其过渡条件。TCP连接在通信开始时经历了三次握手建立连接,然后进行数据传输,最后进行四次握手断开连接。以下是TCP连接的状态迁移图解释:
TCP连接的状态迁移图
CLOSED:
初始状态,表示TCP连接处于关闭状态。LISTEN:
表示服务器准备好接受传入的连接请求(通过listen()
函数进入此状态)。SYN_SENT:
客户端发送一个连接请求后进入此状态,等待服务器的确认。SYN_RECEIVED:
服务器接收到客户端的连接请求,并发送确认。此时服务器和客户端都已经发送了SYN报文。ESTABLISHED:
连接建立成功,双方可以进行数据传输。FIN_WAIT_1:
表示一端(通常是客户端)已经发送了连接终止请求(FIN),等待另一端的确认。CLOSE_WAIT:
表示一端(通常是服务器)已经收到对方的连接终止请求,并发送了确认,但是还没有发送自己的连接终止请求。FIN_WAIT_2:
表示一端已经收到了对方的连接终止请求的确认,等待对方的连接终止请求。CLOSING:
表示双方同时发送了连接终止请求(同时发送了FIN报文),但是还没有收到对方的确认。LAST_ACK:
表示一端发送了连接终止请求并收到了对方的确认,但是还需要等待最后的确认(ACK)。TIME_WAIT:
表示连接已经终止,等待足够的时间以确保远程端收到了连接终止请求的确认。这个状态是为了处理可能出现的延迟报文。CLOSED:
最终状态,表示连接彻底关闭。状态迁移说明:
- 连接建立阶段:从
CLOSED
到LISTEN
,再到SYN_SENT
和SYN_RECEIVED
,表示TCP连接的建立过程,涉及到三次握手。- 数据传输阶段:在
ESTABLISHED
状态下进行数据传输。- 连接终止阶段:从
FIN_WAIT_1
到LAST_ACK
,表示连接的断开过程,涉及到四次握手。- 连接终止完成:最终回到
CLOSED
状态,表示连接彻底关闭。注意:
- TCP状态迁移图是根据RFC 793定义的TCP协议状态机而来,但实际实现中可能会有一些变化或扩展,例如引入了一些优化的状态或者扩展了某些状态以支持更复杂的应用场景。
这些状态和状态之间的迁移规则是TCP协议在建立和断开连接过程中的基础,确保了可靠的数据传输和连接管理。
big_htonl.c 字节序转换
#include <func.h>int main()
{int num=1234;int* p=#printf("*p=%x\n",*p);//主机字节序-->网络字节序 整数int netNum=htonl(num); printf("num=%08x,netnum=%08x\n",num,netNum);printf("num=%d,netnum=%d\n",num,netNum);//端口号-->网络字节序int port=8080;int netport=htons(port);printf("port=%08x,netport=%08x\n",port,netport);//网络字节序端口-->主机字节序int htport=ntohs(port);printf("htport=%08x\n",htport);return 0;
}
*p=4d2
num=000004d2,netnum=d2040000
num=1234,netnum=-771489
addr.c IP地址的转换
include <func.h>int main()
{
//点十分-->32位网络字节序const char* ip="192.168.30.129";struct in_addr addr;inet_aton(ip,&addr); printf("addr=%08x\n",addr.s_addr);//32位网络字节序-->点十分char* pip=inet_ntoa(addr);printf("pip:%s\n",pip);return 0;
}
addr=811ea8c0
pip:192.168.30.129
作业喵:
01:OSI模型有哪些层?TCP/IP模型有哪些层?他们之间的对应关系是怎样的?
物理层 光纤电缆,基础设置
数据链路层 MAC地址 网卡,ARG/RARG
网络层 IP地址,定位主机
传输层 发送传输数据,主机上的一个进程,TCP协议,UDP协议
会话层 创建会话的窗口
表示层 对数据进行加密解密
应用层 数据
物理层,数据链路层,网络层,传输层,应用层(对应会话层+表示层+应用层)
02:TCP协议如何保证数据的可靠传输?
TCP首部:
源地址,目的地址,序号,确认号,偏移长度,窗口,检验和,紧急指针,数据,填充
标志位——FIN,SYN,ACK,PSH,URG,RST
重传机制
RTT>RTO时, 认为报文丢失,重新发送报文
快速重传
三个相同的ACK唤醒该机制,认为报文丢失,重新发送报文
SACK机制
SACK(selection acknownledge)选择性确认,确认收到多个不连续的数据段
丢时的报文在ACK和SACK之间
03:为什么TCP需要三次握手?两次握手为什么不行?
————三次握手流程喵
client-->server SYN,seq=x(随机)
server-->client ACK,SYN,seq=y,ack=x+1
client-->server ACK,ack=y+1
————避免client和server的认知不一致,造成server的资源浪费
情况1:多次发送(发送延迟)
client-->server SYN 第一次发送 延迟
client-->server SYN 第二次发送 -->server -->ACK-->client 完成连接
-->server 延迟的SYN到达server,server认为已经连接完毕,等待client传输信息
server资源浪费
情况2:回复丢失
client-->server SYN 第一次发送 -->server -->ACK 回复丢失
client认为连接建立失败
server认为连接建立成功,等待client传输信息
server资源浪费
04:TCP断开连接时为什么是4次挥手?为什么主动断开的一方要经历TIME_WAIT状态?
TIME_WAIT超时丢弃喵
四次挥手
client-->server FIN ( FIN_WAIT1 CLOSE_WAIT)
server-->client ACK ( FIN_WAIT2
server-->client FIN ( TIME_WAIT LAST_ACK)
client-->server ACK ( CLOSED CLOSED)
为了保证绝大多数情况都能顺利完成四次挥手喵(WHY SAID)
假设删除
情况1:(回复丢失)
client-->server ACK ( CLOSED CLOSED) 丢失了喵
client 状态CLOSED,server接收不到ACK,重发三次FIN
server资源浪费
情况2:(消失的他)
一个和client五组元信息相同的client_sister
client-->server 一起养只小猫 to server 绝交
client_sister & server 连接
一起养只小猫 to server 到达 (TIME_WAIT状态,超时一起养小猫邀请失效)
client_sister and server 一起养了小猫
信息错乱喵
TAS:
TCP连接是全双工的连接喵,要关闭两个方向的数据传输
05:一般情况下,在Windows上如何抓包呢?请给出使用方法,并截图抓取QQ消息的演示结果
06:什么是大端模式和小端模式,什么是主机字节序和网络字节序?编写代码,验证一下自己的机器是大端模式还是小端模式?
大端模式——低地址高字节(主机使用)
小段模式——低地址低字节(网络使用)
主机字节序——主机CPU进行数据传输和存储时的采用的字节顺序,有大端序和小端序
网络字节序——在网络进行数据传播时统一使用的字节顺序
#include <func.h>int main()
{int num=1234;int* p=#printf("*p=%x\n",*p);return 0;
}
TAS:
大端模式/大端法/Big-Endian: 是指`高位字节`存储在内存的`低地址`端,而低位字节存储在内存的高地址端。 小端模式/小端法/Little-Endian: 和大端法相反,`低位字节`存储在内存的`低地址`端,高位字节存储在内存的高地址端。Eg: 代码示例: 参考我们上课代码 int main(int argc,char*argv[]) {// 先定义一个int数据int num = 0x75767778;// 75 -> 高字节位// 78 -> 低字节位// 小端法: (低地址 存 低字节位) 78 -> 低地址// 78 77 76 75//低地址 高地址// 首地址// 首地址指向78char *c = (char *)#// 78 -> 16进制// 0111 1000 -> 二进制// 120 -> 10进制// x -> ascii码表printf("char : %c \n", *c); // 打印结果x// htonl: 把主机字节序转成网络字节序 (即:小端 -> 大端)int n_num = htonl(num);// 75 76 77 78//低地址 高地址//首地址//首地址指向75 char *c2 = (char *) &n_num;// 75 -> 十六进制// 0111 0101 -> 二进制// 117 -> 十进制// u -> ascii码表printf("char : %c \n", *c2);//打印结果ureturn 0; }
补:
01:出现大量TIME_WAIT状态怎么处理
调整MSL的时间,排查产生的原因
02:2MSL
2MSL(Two Maximum Segment Lifetime)是TCP协议中的一个重要概念,指的是TIME_WAIT状态的持续时间。在TCP连接中,TIME_WAIT状态是在连接关闭后保持一段时间的状态,以确保在网络中传输的所有数据包都被确认。
- MSL(Maximum Segment Lifetime)指的是TCP报文在网络上允许存活的最长时间。2MSL则是TIME_WAIT状态的持续时间,通常被定义为2倍的MSL。
- MSL的具体值取决于操作系统和网络环境,一般情况下在几分钟到几十分钟之间。