• 2、TCP协议基础


    TCP协议基础

    1、3次握手建立连接

    SYN表示建立连接的标志位,ACK为应答标志位

    客户端 服务器 SYN 1000(0)(包号,(包携带的数据大小))<数据上限> SYN 8000(0),ACK 1001(序号1001表示1001之前数据全部收到) ACK 8001(0) 客户端 服务器

    以上三个箭头就是三次握手,accept和connect成功返回,表示三次握手已经成功

    2、数据通信

    客户端 服务器 1001(20),ACK 8001(ACK表示三次握手成功) 8001(10),ACK 1021 ACK 8011 客户端 服务器

    注意:不是每通信一次就要做出ACK应答,可以批量做出应答

    3、四次握手关闭连接

    客户端 服务器 FIN 1021(0) ACK 8011 ACK 1022 进入半关闭状态,写缓存区关闭 FIN 8011(0) ACK(1023) ACK 8012 客户端 服务器

    ​ 有4次握手的原因:半关闭

    ​ 半关闭后可以继续发送ACK应答:因为连接还存在,只是关闭了写缓存区

    4、滑动窗口和数据包格式

    ​ 主要是为了防止数据丢失,告诉客户端缓存区有多少容量,让客户端发送时注意。

    5、TCP通信时序

    三次握手:

    ​ 主动发起请求,发送SYN标志位,请求建立连接。携带数据包包号、数据字节数(0)、滑动窗口大小

    ​ 被动接收连接请求端:发送ACK标志位,同时携带SYN请求标志位。携带序号,确认序号、数据字节数,滑动窗口大小。

    ​ 主动发起连接请求端,发送ACK标志位,应答服务器连接请求。携带确认序号。

    四次挥手:

    ​ 主动关闭连接请求端,发送FIN标志位。

    ​ 被动关闭连接请求端,应答ACK标志位。 -----半关闭完成

    ​ 被动关闭连接请求端,发送FIN标志位。

    ​ 主动关闭连接请求端,应答ACK标志位。

    滑动窗口:

    ​ 发送给连接端,本端的缓存区大小,保证数据不会丢失。

    6、错误处理函数的封装

    例如:

    int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr)
    {
    	int n;
    
    again:
    	if ((n = accept(fd, sa, salenptr)) < 0) {
    		if ((errno == ECONNABORTED) || (errno == EINTR))
    			goto again;
    		else
    			perr_exit("accept error");
    	}
    	return n;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    ​ 系统调用的错误都存储于 errno中,errno由操作系统维护,存储就近发生的错误,即下一次的错误码会覆盖掉上一次的错误。

  • 相关阅读:
    回溯去重问题
    【NLP】预训练模型——GPT1
    微信小程序自动化测试pytest版工具使用方法
    硬件寿命警告!Windows11在特定情况下对【固态硬盘】执行与【机械硬盘】相同的磁盘碎片整理。
    算法的概述
    molecular-graph-bert(一)
    MySQL【数据处理的增删改】
    arduino(esp8266)驱动74hc595进行流水灯异常一例
    python常用函数总结大全
    一种通用的项目开发规范
  • 原文地址:https://blog.csdn.net/misikamikirto/article/details/133761090