Linux网络编程之“TCP”

124 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 24 天,点击查看活动详情

一、TCP通信流程分析

  • server:

    1. socket() 创建socket

    2. bind() 绑定服务器地址结构

    3. listen() 设置监听上限

    4. accept() 阻塞监听客户端连接

    5. read(fd) 读socket获取客户端数据

    6. 小--大写 toupper()

    7. write(fd)

    8. close();

  • client:

    1. socket() 创建socket

    2. connect(); 与服务器建立连接

    3. write() 写数据到 socket

    4. read() 读转换后的数据。

    5. 显示读取结果

    6. close()

网络通信流程图

image.png

二、握手

三次握手

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

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

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

四次挥手

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

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

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

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

TCP协议握手示意图

image.png

滑动窗口

发送给连接对端,本端的缓冲区大小(实时),保证数据不会丢失。

三、错误处理函数

封装目的: 在 server.c 编程过程中突出逻辑,将出错处理与逻辑分开,可以直接跳转man手册。

  • 【wrap.c】

    1. 存放网络通信相关常用 自定义函数

    2. 命名方式:系统调用函数首字符大写, 方便查看man手册

      如:Listen()、Accept();

    3. 函数功能:调用系统调用函数,处理出错场景。

    4. 在 server.c 和 client.c 中调用 自定义函数

    5. 联合编译 server.c 和 wrap.c 生成 server

      client.c 和 wrap.c 生成 client

四、read函数

  • readn:读 N 个字节

  • readline:读一行

  • read 函数的返回值:

    1. > 0 实际读到的字节数

    2. = 0 已经读到结尾(对端已经关闭)【 !重 !点 !】

    3. -1 应进一步判断errno的值:

      errno = EAGAIN or EWOULDBLOCK: 设置了非阻塞方式 读。 没有数据到达。

      errno = EINTR 慢速系统调用被 中断。

      errno = “其他情况” 异常。