0718,TCP协议,三次握手,四次挥手

爬东西只能明天了喵

上课喵: 

TCP(Transmission Control Protocol,传输控制协议)的状态迁移图

这图别看,会瞎

TCP(Transmission Control Protocol,传输控制协议)的状态迁移图描述了TCP连接在不同阶段的状态变化及其过渡条件。TCP连接在通信开始时经历了三次握手建立连接,然后进行数据传输,最后进行四次握手断开连接。以下是TCP连接的状态迁移图解释:

TCP连接的状态迁移图
  1. CLOSED:

    初始状态,表示TCP连接处于关闭状态。
  2. LISTEN:

    表示服务器准备好接受传入的连接请求(通过listen()函数进入此状态)。
  3. SYN_SENT:

    客户端发送一个连接请求后进入此状态,等待服务器的确认。
  4. SYN_RECEIVED:

    服务器接收到客户端的连接请求,并发送确认。此时服务器和客户端都已经发送了SYN报文。
  5. ESTABLISHED:

    连接建立成功,双方可以进行数据传输。
  6. FIN_WAIT_1:

    表示一端(通常是客户端)已经发送了连接终止请求(FIN),等待另一端的确认。
  7. CLOSE_WAIT:

    表示一端(通常是服务器)已经收到对方的连接终止请求,并发送了确认,但是还没有发送自己的连接终止请求。
  8. FIN_WAIT_2:

    表示一端已经收到了对方的连接终止请求的确认,等待对方的连接终止请求。
  9. CLOSING:

    表示双方同时发送了连接终止请求(同时发送了FIN报文),但是还没有收到对方的确认。
  10. LAST_ACK:

    表示一端发送了连接终止请求并收到了对方的确认,但是还需要等待最后的确认(ACK)。
  11. TIME_WAIT:

    表示连接已经终止,等待足够的时间以确保远程端收到了连接终止请求的确认。这个状态是为了处理可能出现的延迟报文。
  12. CLOSED:

    最终状态,表示连接彻底关闭。
状态迁移说明:
  • 连接建立阶段:从CLOSEDLISTEN,再到SYN_SENTSYN_RECEIVED,表示TCP连接的建立过程,涉及到三次握手。
  • 数据传输阶段:在ESTABLISHED状态下进行数据传输。
  • 连接终止阶段:从FIN_WAIT_1LAST_ACK,表示连接的断开过程,涉及到四次握手。
  • 连接终止完成:最终回到CLOSED状态,表示连接彻底关闭。
注意:
  • TCP状态迁移图是根据RFC 793定义的TCP协议状态机而来,但实际实现中可能会有一些变化或扩展,例如引入了一些优化的状态或者扩展了某些状态以支持更复杂的应用场景。

这些状态和状态之间的迁移规则是TCP协议在建立和断开连接过程中的基础,确保了可靠的数据传输和连接管理。

big_htonl.c    字节序转换

#include <func.h>

int main()
{
    int num=1234;
    int* p=&num;
    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  一起养了小猫
信息错乱喵

05:一般情况下,在Windows上如何抓包呢?请给出使用方法,并截图抓取QQ消息的演示结果

06:什么是大端模式和小端模式,什么是主机字节序和网络字节序?编写代码,验证一下自己的机器是大端模式还是小端模式?

大端模式——低地址高字节(主机使用)

小段模式——低地址低字节(网络使用)

主机字节序——主机CPU进行数据传输和存储时的采用的字节顺序,有大端序和小端序

网络字节序——在网络进行数据传播时统一使用的字节顺序

#include <func.h>

int main()
{
    int num=1234;
    int* p=&num;
    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
 //低地址        高地址
 // 首地址
 
 // 首地址指向78
 char *c = (char *)&num;

 // 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);//打印结果u
 return 0;
}

相关推荐

  1. TCP握手挥手

    2024-07-19 04:40:01       34 阅读
  2. tcp握手挥手

    2024-07-19 04:40:01       35 阅读
  3. tcp握手挥手

    2024-07-19 04:40:01       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 04:40:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 04:40:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 04:40:01       58 阅读
  4. Python语言-面向对象

    2024-07-19 04:40:01       69 阅读

热门阅读

  1. postman接口测试工具详解

    2024-07-19 04:40:01       21 阅读
  2. 自制数据集处理

    2024-07-19 04:40:01       19 阅读
  3. layui前端开发-记录一次弹窗嵌套表格功能的开发

    2024-07-19 04:40:01       19 阅读
  4. oracle 查询锁 && 解锁

    2024-07-19 04:40:01       20 阅读
  5. 初识Redis

    2024-07-19 04:40:01       17 阅读
  6. redis setnx使用方法

    2024-07-19 04:40:01       18 阅读
  7. 微服务

    微服务

    2024-07-19 04:40:01      17 阅读
  8. perf工具学习材料

    2024-07-19 04:40:01       17 阅读
  9. opencv—常用函数学习_“干货“_3

    2024-07-19 04:40:01       16 阅读
  10. k8s学习——升级后的k8s使用私有harbor仓库

    2024-07-19 04:40:01       25 阅读
  11. LVS的DR模式

    2024-07-19 04:40:01       19 阅读
  12. 前端常用工具库

    2024-07-19 04:40:01       19 阅读
  13. 智能灯光的工作原理

    2024-07-19 04:40:01       19 阅读
  14. 安全防御:防火墙基本模块

    2024-07-19 04:40:01       21 阅读
  15. Qt区分鼠标按下时移动的是哪个多边形

    2024-07-19 04:40:01       19 阅读