20.传输层协议TCP

一.TCP协议

TCP和UDP不同,TCP既有发送缓冲区,又有接收缓冲区,UDP只有接收缓冲区

1.4位首部长度

TCP解包:提取4位首部长度,读取该信息,进行解包(拿到对应的数据)

TCP分用:根据端口号就能向上层进行交付(传输层 -> 应用层)

2.序号和确认序号

但是为啥要用序号和确认序号呢?只有一个,不也能实现确认是否信息是否到达的功能吗?

所以,我们的捎带应答也要对应的回复应答的,信号和确认信号是必须同时存在的

3.16位窗口大小:

流量控制,不一定是减少数据量发送,也可以加大数据的发送(提供发送的效率)

4.确认应答机制

5.超时重传

主机A是无法确定到底是数据丢了还是应答丢了

cpp 复制代码
#include <stdio.h>
#include <signal.h>
#include <time.h>

// 定时器回调函数
void timer_handler(int signum) {
    printf("定时器触发!\n");
}

int main() {
    timer_t timer_id;
    struct sigevent sev;
    struct itimerspec its;

    // 设置信号处理函数(捕获SIGALRM信号)
    signal(SIGALRM, timer_handler);

    // 初始化定时器事件
    sev.sigev_notify = SIGEV_SIGNAL;  // 用信号通知
    sev.sigev_signo = SIGALRM;        // 使用SIGALRM信号
    sev.sigev_value.sival_ptr = &timer_id;  // 传递定时器ID

    // 创建定时器
    if (timer_create(CLOCK_REALTIME, &sev, &timer_id) == -1) {
        perror("timer_create失败");
        return 1;
    }

    // 设置定时器参数(1秒后触发,只触发一次)
    its.it_value.tv_sec = 1;    // 初始触发时间(秒)
    its.it_value.tv_nsec = 0;   // 初始触发时间(纳秒)
    its.it_interval.tv_sec = 0; // 间隔时间(0表示只触发一次)
    its.it_interval.tv_nsec = 0;

    // 启动定时器
    if (timer_settime(timer_id, 0, &its, NULL) == -1) {
        perror("timer_settime失败");
        return 1;
    }

    printf("等待定时器触发...\n");
    pause();  // 暂停进程,等待信号

    return 0;
}

所以,我们只要知道操作系统是能够给我们进行定时器的设定就行了

二.TCP链接管理

三次握手是系统自动完成的和我们用户没关系(我们用户只要调用对应的接口,让内核进行操作即可)

三次握手,也是会失败的

当ACK返回失败了,客户端还进行发送数据了,那么服务器就会收到对应的消息,但是服务器还是没有建立连接的,所以给客户端发送的数据里面会将一些标志位进行设置

所以,三次握手本质上就是四次握手,但是这里的中间的一次进行捎带应答

四次挥手也可以变成三次挥手

这个shutdown本质就是对文件权限进行操作(半通信)

等待2倍的MSL,就是等待历史的游离报文,在网络中消散!(2 * MSL是建议值,大概是消息的来回的时间)

那么要是服务器先进行断开连接呢?

TIME_WAIT还要进行回应对应的ACK

查对应的TIME_WAIT的时间,如下:

三.流量控制

窗口探测和窗口更新通知两种策略同时都会进行

四.滑动窗口

所以,滑动窗口是可以进行变大,不变,变小,也可以为0的

本质上就是基于环形队列的生产者消费者模型

五.其他标志位的认识

URG标志位为1就是有紧急数据,紧急指针就是执行对应的紧急的报文部分(可以用AI进行实操)

六.拥塞控制

七.延迟应答

八.捎带应答

九.面向字节流

十.粘包问题

十一.TCP异常情况

相关推荐
开心大爆炸7 小时前
xrdp 连接 登录对话框输入密码后闪退
linux·运维·服务器
我爱cope8 小时前
【计算机网络 | 网络层11:ICMP 协议:Ping 和 Traceroute 的底层原理】
网络·学习·计算机网络
心抵鹊8 小时前
归并排序之翻转对(hard)
数据结构·算法
_Twink1e8 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
Latticy8 小时前
vulnhub系列靶机-Photographer
网络·网络安全·内网渗透·内网
爱浦路 IPLOOK8 小时前
矿山无人化作业5G专网方案:企业专网核心网络选型分析
网络·分布式·科技·5g·信息与通信
制冷技术咨询与服务8 小时前
某纯电牵引车的CAN网络3
网络·某纯电牵引车的can网络2
苏生Susheng9 小时前
【软件实施】Linux系统Shell脚本教程
linux·运维·服务器·chrome·spring boot·学习·实施
dong_junshuai9 小时前
每天一个开源项目#87 fmt:24.5K Stars 的 C++ 格式化核心
c++·开源·github
曹牧9 小时前
C#:文本文件读取
服务器·前端·c#