首页 > 其他分享 >TCP协议三次握手的原因是什么?为什么不用两次握手和4次握手?

TCP协议三次握手的原因是什么?为什么不用两次握手和4次握手?

时间:2023-05-07 10:32:07浏览次数:53  
标签:握手 TCP 收到 三次 100 101 给我发 servaddr


今天复习了TCP协议的三次握手,对上一篇C++网络编程有了更深的理解。

当时考研的时候计网学过,这里再总结一下分享。网图都是截图来的,侵删。



TCP协议三次握手的原因是什么?为什么不用两次握手和4次握手?_序列号


TCP协议属于传输层协议,上面的应用层协议包括HTTP、FTP之类,应用层协议是最接近用户的,每往下一层就套一层头部数据来提供给当前层协议解析。那么对于TCP协议,上层传来的数据也会在传输层添加一个TCP头部,当然规则很复杂,我们只需要关注几个重要的就行。



TCP协议三次握手的原因是什么?为什么不用两次握手和4次握手?_TCP_02


主要关注32位序列号、32位确认号,和几个标志位,例如SYN,ACK,FIN

1.什么是三次握手?三次握手的流程

场景:我是客户端,你是服务器,我们不能像平常讲话一样一起说互相听得到,我不确定你听没听到,你也不确定我听没听到,而且我们所有的话都是要按顺序说的,也就是说每次我要确认你听到我所有的话之后,我才会接着说话。如何确定你收到了?

先看下面这个拟人场景,要是说不会三次握手我是不信的,其实你已经会了,不信看下面。

我:兄弟,你听得到吗,我给你个100, 你听到了给我回个101哈?

你:兄弟兄弟,收到收到,给你发个101,我给你个序列号200哈,你要是收到了给我个201?

我:兄弟,我看到你发的200了,balabala开始唠嗑。

三次握手就是上面的三个步骤。



TCP协议三次握手的原因是什么?为什么不用两次握手和4次握手?_序列号_03


首先一开始两个机器都是关着的,服务器创建socket并且开始监听模式,

// 第1步:创建服务端的socket。
    int listenfd;
    if ( (listenfd = socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket"); return -1; }
 
    // 第2步:把服务端用于通信的地址和端口绑定到socket上。
    struct sockaddr_in servaddr;    // 服务端地址信息的数据结构。
    memset(&servaddr,0,sizeof(servaddr));
    servaddr.sin_family = AF_INET;  // 协议族,在socket编程中只能是AF_INET。
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);          // 任意ip地址。
    //servaddr.sin_addr.s_addr = inet_addr("192.168.190.134"); // 指定ip地址。
    servaddr.sin_port = htons(atoi(argv[1]));  // 指定通信端口。
    if (bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) != 0 )
    { perror("bind"); close(listenfd); return -1; }
    if (listen(listenfd,5) != 0 ) { perror("listen"); close(listenfd); return -1; }

客户端发起连接请求,上一篇博客javascript:void(0)有相关代码,然后就是把上面的拟人小场景翻译过来就可以了,问题不大,还是挺简单的。

往后每次交互的时候双方都有自己的序列号,互相更新,表示数据传到哪里了,有没有传错,例如我现在给你序列号是100,那我希望你给我返回101,这个101的含义是,你100以内接收完了,希望接收到101.

注意:第三次握手可以传送数据了,所以小场景里面有巴拉巴拉,前两次都是不可以的。


两次握手的差别

三次握手如上所示,那么如果说,3次要改成2次的话,怎么改?显然是把中间那一段去掉。

我:兄弟我给你个100,你收到的话给我发个101哈

你:兄弟,我收到了你的100, 我现在给你101, 我给你一个序列号200,你给我发个201。巴拉巴拉

此时链接已经建立了,如果采用2次握手,你已经可以给我发消息了。

想一下图,我懒得画了。

考虑如下情况:

我:兄弟,我给你个100哦,你收到给我发101

。。。 没理我

我:兄弟,你咋不理我,那我给你发个200哦,你收到给我发201。

。。。(网络不太行,前面那个100的在路上没收到,现在刚到)

你:兄弟,我收到了你的100,我现在给你发101,我给你序列号300,你收到给我发301,巴拉巴拉

(这个时候链接建立了,你给我传数据了巴拉巴拉)

我:兄弟,你搞错了,100是我刚才发的,我现在要的是201不是101,你快快stop。

你:兄弟,收到了我stop

(刚才那个200的你现在才收到)

你:兄弟,我收到200了,给你201,我序列300,你给我发301.

开始正常运作。。

注意看上面红色的字,传了一波数据,这波数据是不应该的,所以会造成链接浪费。

三次握手就不会出现这样的情况。

我:兄弟,我给你发100,你给我发101

。。。没理我

我:兄弟,我给你发200,你给我发201

。。。(网络不太行,前面那个100的在路上没收到,现在刚到)

你:兄弟,我收到了你的100,我现在给你发101,我给你序列号300,你收到给我发301,巴拉巴拉

(三次链接这里不会传数据,没有巴拉巴拉,还在等我回复再传数据)

我:兄弟,你搞错了,100是我刚才发的,我现在要的是201不是101,你快快stop。

你:兄弟,收到了我stop

(刚才那个200的你现在才收到)

你:兄弟,我收到200了,给你201,我序列300,你给我发301.

开始正常。

差别就在上面那里。


累了今天不写了,择日在写

标签:握手,TCP,收到,三次,100,101,给我发,servaddr
From: https://blog.51cto.com/u_15440701/6251704

相关文章

  • CS144 计算机网络 Lab4:TCP Connection
    前言经过前面几个实验的铺垫,终于到了将他们组合起来的时候了。Lab4将实现TCPConnection功能,内部含有TCPReceiver和TCPSender,可以与TCP连接的另一个端点进行数据交换。实验要求简单来说,这次实验就是要在TCPConnection类中实现下图所示的有限状态机:这些状态对应T......
  • TCP/IP-2023-05-06
    1、图片来自:https://www.bunian.cn/3772.html 2、三次握手四次挥手见《TCP三次握手四次挥手-嵌入式Linux网络编程基础-麦子学院》的11:00开始的地方。【返回目录树】......
  • GB/T28181-2022相对2016版“基于TCP协议的视音频媒体传输要求“规范解读和技术实现
    ​规范解读GB/T28181-2022和GB/T28181-2016规范,有这么一条“更改了附录D基于TCP协议的视音频媒体传输要求(见附录D,2016年版的附录L)。”。本文主要是针对GB/T28181-2022里面提到的“基于TCP协议的视音频媒体传输要求”做相应的接口适配,在此之前,我们先回顾下规范里面针对......
  • 一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
    文章目录1Socket讲解2基于Socket的TCP编程3客户端Socket的工作过程包含以下四个基本的步骤3.1客户端创建Socket对象4服务器程序的工作过程包含以下四个基本的步骤:4.1服务器建立`ServerSocket`对象5案例实现客户端和服务端通信5.1代码实现5.2实现结果6更多案例分析6.1客......
  • TCP的三次握手和四次挥手分析
    一、tcp报文格式主要关注的字段为:源端口号(SourcePort),目的端口号(DestinationPort)序列号seq(SequenceNumber)确认号ack(AcknowledgmentNumber)标志位:ACK,SYN,FIN二、三次握手客户端将TCP报文标志位SYN置为1,随机产生一个序号值seq=x,发送给服务端。发送完毕后,客户端进入SYN_......
  • javaNIO创建tcp服务器时的重要点
    在使用NIO创建非阻塞tcp服务器时,几个容易出现问题的点,如下代码注释所示:packagenet.yury.nio;importjava.io.IOException;importjava.net.InetSocketAddress;importjava.nio.ByteBuffer;importjava.nio.CharBuffer;importjava.nio.channels.*;importjava.nio.charse......
  • 【C# TCP】
    https://www.cnblogs.com/yilezhu/p/12045018.html  https://blog.51cto.com/u_11990719/3112576 https://blog.csdn.net/lgj123xj/article/details/129868074https://blog.51cto.com/u_11990719/3112576 传输层TCP这里的TCP指的是传输层TCP,双方约定好协议内容,通过Soc......
  • 练习——简单的TcpCS了解基本概念
    packagecom.net;importjava.io.IOException;importjava.io.OutputStream;importjava.net.*;//客户端@SuppressWarnings({"all"})publicclassTCPClient_{publicstaticvoidmain(String[]args){Socketsocket=null;OutputS......
  • 雷达问问 | 2023年02月第三次问题及解答汇总
    【雷达问问】是公众号平台新推出的一个文章板块,目的是搜集在雷达技术交流群、私信、知乎,以及其他地方的关于雷达的问题或信息,方便为后来人提供参考。关于问题的解答,主要是雷达行业人员的回答,并不是权威,仅供大家参考,如有疑问,欢迎交流。【雷达问问】1、初学者想问下:波束形成和DOA估计......
  • 河北稳控科技多通道振弦传感器无线采集仪发送数据到 TCP 服务器及远程修改参数
    河北稳控科技多通道振弦传感器无线采集仪发送数据到TCP服务器及远程修改参数 1、发送数据到TCP服务器参数配置(下列参数位于【参数配置】区域内的【自动模式参数】和【GPRS】面板内)数据发送方式:GPRSTCP数据包协议:字符串1.0TCP相关的其它参数可不进行配置,使用我们......