首页 > 其他分享 >TCP传输协议

TCP传输协议

时间:2024-06-05 20:34:24浏览次数:19  
标签:协议 重传 int TCP 传输 sockfd 接字 接收

TCP传输协议

TCP是一种面向连接的传输协议,提供可靠的数据传输服务。它通过一系列机制确保数据从发送方准确无误地传送到接收方。

实现可靠性的原理

1、三次握手建立连接

  • 第一次握手:客户端发送一个SYN(同步序列号)包给服务器,表明客户端希望建立连接。
  • 第二次握手:服务器接收到SYN包,发送一个SYN-ACK(同步序列号确认)包作为响应,表示同意建立连接并确认客户端的SYN。
  • 第三次握手:客户端接收到SYN-ACK包,发送一个ACK(确认)包给服务器,确认建立连接。

2、序列号和确认机制

  • 序列号:发送方给每个数据段分配一个序列号,用于标识数据段的位置。
  • 确认号:接收方发送ACK包,包含下一个期望接收的序列号,确认已成功接收到的数据段。

3、超时重传

  • 超时时间:根据网络条件动态调整,防止频繁重传和不必要的等待。
  • 重传机制:发送方在超时后重发数据段,保证丢失的数据能够被重新传输。

4、流量控制

  • 窗口大小:接收方通告的接收窗口(Receive Window)大小,表示接收方当前可以接收的数据量。
  • 滑动窗口:发送方根据接收方的窗口大小动态调整发送速率,防止网络拥堵和接收方的缓冲区溢出。

5、拥塞控制

  • 慢启动(Slow Start):初始阶段逐步增加发送窗口,避免一开始就发送大量数据导致网络拥塞。
  • 拥塞避免(Congestion Avoidance):在接近网络带宽极限时,缓慢增加发送窗口,防止拥塞。
  • 快速重传(Fast Retransmit):在接收到三个重复的ACK后,立即重传丢失的数据段。
  • 快速恢复(Fast Recovery):重传后,不进入慢启动阶段,而是将窗口减半,快速恢复数据传输。

6、校验和

  • 校验和计算:发送方计算校验和并将其附加到数据段中。
  • 校验和验证:接收方接收数据段后重新计算校验和,验证数据完整性。如果校验和不匹配,数据段将被丢弃并请求重传。

通过以上机制,TCP能够实现可靠的数据传输,确保数据的完整性、顺序性和无错误传输。

四次挥手流程图

客户端                                 服务器
   |                                     |
FIN_WAIT_1 (发出 FIN)   ------>   CLOSE_WAIT (收到 FIN,发出 ACK)
   |                                     |
FIN_WAIT_2 (收到 ACK)   <------   CLOSE_WAIT (准备关闭连接)
   |                                     |
FIN_WAIT_2 (等待 FIN)   <------   LAST_ACK (发出 FIN)
   |                                     |
TIME_WAIT (收到 FIN, 发出 ACK) <------   CLOSED (收到 ACK)
   |                                     |
CLOSED (等待 2*MSL)        ------>   CLOSED (关闭连接)

TCP传输所需API

int socket(int domain, int type, int protocol);   //返回主机套接字

domain:家族协议,如AF_INET (IPv4)AF_INET6 (IPv6)

type:套接字类型SOCK_STREAM (TCP)

protocol:协议,一般默认0系统帮忙选择合适的协议。

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);  //绑定套接字

sockfd:套接字文件描述符。

addr:包含地址和端口的结构体。

addrlen:地址结构体的长度。

int listen(int sockfd, int backlog);    //设置套接字为监听模式,准备接受连接

sockfd:套接字文件描述符。

backlog:请求队列的最大长度。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);  //接受连接请求,连接成功返回一个客户端套接字

sockfd:监听套接字文件描述符。

addr:指向存储客户端地址的结构体。

addrlen:地址结构体的长度。

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);  //向服务器发起连接请求

sockfd:监听套接字文件描述符。

addr:指向存储客户端地址的结构体。

addrlen:地址结构体的长度。

ssize_t send(int sockfd, const void *buf, size_t len, int flags);  //发送数据
ssize_t recv(int sockfd, void *buf, size_t len, int flags);        //接收数据

sockfd:监听套接字文件描述符。

buf:数据缓冲区。

len:缓冲区长度。

falgs:可选的标志位(通常为 0),可设置非阻塞。

int close(int sockfd);                 	    //关闭套接字
int shutdown(int sockfd, int how);	    //关闭套接字部分通道

sockfd:套接字文件描述符。

how:指定关闭方式,如 SHUT_RDSHUT_WRSHUT_RDWR,选择关闭部分套接字管道。

C/S架构TCP传输流程图

image

标签:协议,重传,int,TCP,传输,sockfd,接字,接收
From: https://www.cnblogs.com/colors-lg/p/18233722

相关文章

  • 网络编程练习题---利用TCP协议完成客户端与服务端点对点通信
    目录题目一解析代码实现题目二:解析代码实现tcp_client.ctcp_server.c题目一设计程序实现解析www.baidu.com的域名,把获取到的百度的IP地址全部输出到终端并验证是否正确。解析主机打算响应某个网站的网络请求,但是只知道网站域名是无法通信的,需要对域名进行地址解析,得到网站的公......
  • 基于c语言的TCP客户端、服务端基础代码
    基于c语言的TCP客户端、服务端基础代码基本流程:客户端:#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<stdio.h>#include<errno.h>#include<sys/socket.h>#include<netinet/in.h>#include<netinet/......
  • 用udp协议传输文件
    用udp协议传输文件目录用udp协议传输文件头文件/宏定义客户端服务器头文件/宏定义#include<stdio.h>#include<stdlib.h>#include<string.h>#include<arpa/inet.h>#include<netinet/in.h>#include<sys/types.h>#include<sys/socket.h>#include<ti......
  • 网络编程中UDP协议通信
    #include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<errno.h>#include<stdlib.h>#include<time.h>#include<string.h>#include<netinet/ip.h>#include<netinet/in.h>#include&......
  • TCP概述
    概述TPC:传输控制协议,TCP协议是面向连接的、可以实现端对端通信的可靠的协议。TCP协议传输数据时会为每个字节分配一个序列号,通过这个序列号就可以判断数据是否重复到达以及数据是否丢失,还可以通过序列号对数据进行排序。报首格式TCP建立连接的三次握手过程TCP三次挥手过......
  • TCP协议网络通信
    TCP协议网络通信目录TCP协议网络通信头文件/宏定义客户端服务器验证结果客户端服务器头文件/宏定义#include<stdio.h>#include<stdlib.h>#include<string.h>#include<arpa/inet.h>#include<netinet/in.h>#include<sys/types.h>#include<sys/socket.h>#includ......
  • TCP和UDP
    TCP和UDPTCP的可靠性特性序列号(Sequencing):TCP为每个传输的数据段分配一个唯一的序列号,接收端可以根据这些序列号重新组装数据。确认与重传(AcknowledgmentandRetransmission):TCP使用确认机制来确认数据段是否成功到达。如果接收端没有收到某个数据段,发送端会重传它。流量控......
  • SpringBoot+Nginx大文件传输
    Nginx配置 #公众端的附件上传location/api/visitor/upload{#Passalteredrequestbodytothislocationupload_pass/api/outerPortal/uploadAndSave;#Storefilestothisdirectory#Thedirectory......
  • TCP_FLAGS_PROCESSING_09: [close-wait| closing | last-ack] FIN -> ignore
    测试目的:验证TCP在CLOSE-WAIT、CLOSING或LAST-ACK状态下,接收到FIN段时是否能够保持当前状态不变。描述:TCP在CLOSE-WAIT、CLOSING或LAST-ACK状态下,当接收到一个FIN段时,不应改变其状态。这是确保TCP连接能够按照正常的关闭序列进行,避免状态的意外变化。测试拓扑:具体步骤......
  • STM32学习(USART通信协议)
            本文章时本人根据江科大视频所记录的笔记,希望对大家的学习能提供帮助。1.通信接口通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统(stm32内部芯片无法得到的数据,需要连接外部芯片获取)通信协议:制定通信的规则,通信双方按照协议规则进行数据收发USAR......