你不知道的TCP协议:四次握手!

2024-05-05 02:04
文章标签 协议 tcp 四次 握手 知道

本文主要是介绍你不知道的TCP协议:四次握手!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

你不知道的TCP协议:四次握手!

前言:我们都知道建立一个tcp连接需要进行三次握手,甚至被问到为什么不是四次握手、两次握手

本文将要介绍tcp协议中的四次握手

正文:

当一个客户端向服务端发起tcp连接请求时,先发送一个SYN包,这个请求是单向的,当服务端接收到该SYN包并进行ACK回复时,三次握手正式开始

那么,两端同时向对方发起连接请求会发生什么呢?图例请参照"tcp\ip协议详解 卷一 p427"

答案是,两端同时向对方发送SYN包,收到对方的SYN包后各自又向对方发送一个SYN+ACK包,一共四次交互

详细介绍以及图例请参照"tcp\ip协议详解 卷一 p427"

代码实现:

#include <stdio.h>
#include <netinet/tcp.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <error.h>
#include <fcntl.h>
#include <arpa/inet.h>#define IP_SIZE   20
#define BUFFER_SIZE 1024int connect_2(int sockfd, char *ip, int port) {struct sockaddr_in addr;memset(&addr, 0, sizeof(struct sockaddr_in));addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr(ip);if (connect(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) < 0) {return -4;}return sockfd;
}int main(int argc, char **argv) {if(argc < 3) {printf("please enter ip and port correctly\n");return -1;}char *ip = argv[1];int port  = atoi(argv[2]);int sockfd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in addr;memset(&addr, 0, sizeof(struct sockaddr_in));addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = htonl(INADDR_ANY);int ret = bind(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in));if (ret == -1) {perror("bind");return -2;}printf("bind success\n");while(1){ret = connect_2(sockfd, ip, port);if (ret < 0) {usleep(1);continue;}break;}printf("connection established\n\n");char recv_buffer[BUFFER_SIZE] = {0};char send_buffer[BUFFER_SIZE] = {0};// recv + send  loopwhile (1) {printf("enter messages to send:\n");fgets(send_buffer, BUFFER_SIZE, stdin);ret = send(sockfd, send_buffer, strlen(send_buffer), 0);if (ret < 0) {perror("send");} else {printf("%d bytes were sent\n\n", ret);}memset(send_buffer, 0, sizeof(send_buffer));ret = recv(sockfd, recv_buffer, BUFFER_SIZE, 0);if (ret < 0) {perror("recv");break;}else if (ret == 0) {perror("disconnect");break;}else {printf("recv %d bytes : %s\n", ret, recv_buffer);memset(recv_buffer, 0, sizeof(recv_buffer));}}close(sockfd);return 0;
}

这份代码创建了一个套接字sockfd,并绑定到指定的端口port,调用connect向另一个socket发起连接

为了实现四次握手,需要在两台电脑或虚拟机上分别运行这份代码,没错,是同一份代码,假如两台机器ip分别是192.168.62.128和192.168.62.131

输入的参数分别是192.168.62.131 8000 和 192.168.62.128 8000 ,你也许发现了两个参数的端口是一样的,没错,为了方便,代码中的端口既用作本端的端口也用于连接时对方的端口

由于两端都使用while循环请求连接,很快就会出现同时发起连接请求的情况,也只有在这种情况下双方才能连接成功,因为两端的代码都没有对本端套接字进行listen监听,不可能实现正常的三次握手 ,也就是说,只要连接成功,就意味着四次握手完成了!

推荐学习https://xxetb.xetslk.com/s/p5Ibb

这篇关于你不知道的TCP协议:四次握手!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960588

相关文章

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议

说一说三大运营商的流量类型,看完就知道该怎么选运营商了!

说一说三大运营商的流量类型,看完就知道该怎么选运营商了?目前三大运营商的流量类型大致分为通用流量和定向流量,比如: 中国电信:通用流量+定向流量 电信推出的套餐通常由通用流量+定向流量所组成,通用流量比较多,一般都在100G以上,而且电信套餐长期套餐较多,大多无合约期,自主激活的卡也是最多的,适合没有通话需求的朋友办理。 中国移动:通用流量+定向流量 移动推出的套餐通常由通用流量+定向

【杂记-浅谈DHCP动态主机配置协议】

DHCP动态主机配置协议 一、DHCP概述1、定义2、作用3、报文类型 二、DHCP的工作原理三、DHCP服务器的配置和管理 一、DHCP概述 1、定义 DHCP,Dynamic Host Configuration Protocol,动态主机配置协议,是一种网络协议,主要用于在IP网络中自动分配和管理IP地址以及其他网络配置参数。 2、作用 DHCP允许计算机和其他设备通

TCP 可靠传输的工作原理

转载地址:https://my.oschina.net/xinxingegeya/blog/485233 感谢原作者 TCP 可靠传输的工作原理 ARQ(Automatic Repeat-reQuest)(自动重传请求) 停止等待ARQ协议 连续ARQ协议   停止等待ARQ协议 全双工通信的双发既是发送方也是接收方。下面为了讨论问题的方便,我们仅考虑A发送数据而B接受数据

视频监控平台:支持交通部行业标准JT/T905协议(即:出租汽车服务管理信息系统)的源代码的函数和功能介绍及分享

目录 一、视频监控平台介绍 (一)概述 (二)视频接入能力介绍 (三)功能介绍 二、JT/T905协议介绍 (一)概述 (二)主要内容 1、设备要求 2、业务功能要求 3、技术功能要求 4、性能要求 5、接口要求 6、设备通信协议与数据格式 三、代码和解释 (一)代码和注释 (二)函数功能说明 1. 头文件保护 2. 包含必要的头文件 3. 引入命名空间std

ESP32使用MQTT_TCP连接阿里云

ESP32-IDF中MQTT函数的介绍 esp_mqtt_client_handle_t esp_mqtt_client_init(const esp_mqtt_client_config_t *config) 函数功能:mqtt 客户端初始化 函数形参: mqtt 客户端的配置 函数返回值:正确则返回根据配置创建的 mqtt 客户端句柄;异常则返回 NULL。 其中函数形参 esp_mqtt

计算机网络协议常考点!!!

应用层协议 HTTP协议 基于TCP协议,是一种用于传输超文本和多媒体内容的协议,主要是为浏览器之前的通信而设计的; get请求和post请求区别 请求参数位置不同:get会将请求参数放在URL后面并通过&运算符连接,而post提交会将请求参数放在请求体里; 请求数据量不同:get的请求参数会受到浏览器对URL最大长度的限制,而post是将请求参数放在请求体中,可以请求大量数据; 安全

网络编程篇:HTTP协议

一.预备知识 在客户端访问服务端时,要用ip+port,但是在日常用户访问服务端的时候,并不会直接使用ip,而是使用域名,比如:百度(www.baidu,com)。                                                                                    在浏览器处理时,会将域名解析为对应的ip+port。

【LinuxC语言】第一个简单的tcp/ip客户端

文章目录 前言一、客户端连接服务器的示意图二、客户端涉及的相关函数socket函数connect函数struct sockaddr结构体相关的转换函数connect主体函数 发送数据函数接收数据函数关闭socket客户端示例代码 总结 前言 在计算机网络中,TCP/IP 是最常见的网络协议。它为我们提供了一种可靠的方式来发送和接收数据。在这篇文章中,我们将使用 Linux C

rtp与rtcp协议详解

目录: 1 RTP概述 1.1 是什么RTP1.2 RTP的应用环境 2 RTP详解 2.1 RTP的协议层次 2.1.1 传输层的子层2.1.2 应用层的一部分 2.2 RTP的封装2.3 RTCP的封装2.4 RTP的会话过程 3 相关的协议 3.1 实时流协议RTSP3.2 资源预定协议RSVP 4 常见的疑问5 实现方案6 参考资料 1 RTP概述 1.1 是什么RTP