Tcp三次握手:
或者:
如上,需要第三次握手的原因在于Server端在第二次握手(发出信息)后并不知道对方是否能够接收、己方的发送功能是否正常。但此时数据的单向通道已经建立,对于Client来说,已经确认了Server端可以接收信号,因此可以单向给Server发送数据了。
示例:
谍战片中,我方人员需要向我方站点传递敌军情报,因此通过各种方式(如刷一张寻物启事到贴到某个指定电线杆)向站点请求(由于不确定信号安全性,因此不能直接传输情报而要先确认双方安全)。请求中包含了某个神秘字符J。此为第一次握手。
站点通过指定方式收到请求后,表明站点安全(可接收情报)以及我情报人员可发出信息,在报纸上登出某个神秘的寻人启事。寻人启事中包含了神秘字符J+1,以及神秘字符K。此时站点并不知道自己的信息是否能被情报人员接收到。此为第二次握手。
我方人员买到报纸一看,J+1表示站点已可接收并发送情报,(自己也可发送)。但站点并不知道情报人员已经收到了它的信息,于是再次发出确认信息(贴电线杆),包含神秘字符K+1。此为第三次握手。连接建立。
如果只有两次握手,则此时仅表明Server端可接收信息,即站点可收到情报人员之情报。这个可以用于常规情报的单向传递,无需请求站点给予指示。
至于为何没有第四次,因为通过三次握手双方已经互相确保了己方、对方都可以正常接收、发送信息了,无需第四次。
简单表达:
第一次:A发送给B:SYN
第二次:B发送给A:SYN+ACK
第三次:A发送给B:ACK
另一种解释:
1:A发,B收, B知道A能发
2:B发,A收, A知道B能发收
3:A发,B收, B知道A能收
另一种准确解释:
TCP作为一种可靠传输控制协议,其核心思想:既要保证数据可靠传输,又要提高传输的效率,而用三次恰恰可以满足以上两方面的需求!
TCP可靠传输的精髓:TCP连接的一方A,由操作系统动态随机选取一个32位长的序列号(Initial Sequence Number),假设A的初始序列号为1000,以该序列号为原点,对自己将要发送的每个字节的数据进行编号,1001,1002,1003…,并把自己的初始序列号ISN告诉B,让B有一个思想准备,什么样编号的数据是合法的,什么编号是非法的,比如编号900就是非法的,同时B还可以对A每一个编号的字节数据进行确认。如果A收到B确认编号为2001,则意味着字节编号为1001-2000,共1000个字节已经安全到达。
同理B也是类似的操作,假设B的初始序列号ISN为2000,以该序列号为原点,对自己将要发送的每个字节的数据进行编号,2001,2002,2003…,并把自己的初始序列号ISN告诉A,以便A可以确认B发送的每一个字节。如果B收到A确认编号为4001,则意味着字节编号为2001-4000,共2000个字节已经安全到达。
一句话概括,TCP连接握手,握的是啥?通信双方数据原点的序列号!
TCP的4次挥手:
所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图:
流程和状态在上图中已经很明了了,在此不再赘述,可以参考前面的四次挥手解析步骤。
四、附注
关于三次握手与四次挥手通常都会有典型的面试题,在此提出供有需求的XDJM们参考:
(1)三次握手是什么或者流程?四次握手呢?答案前面分析就是。
(2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
UDP协议:
UDP(User Data Protocol,用户数据报协议)
(1) UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
(2) 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
(3) UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
(4) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
(5)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。
(6)UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。
UDP的包头结构:
源端口 16位
目的端口 16位
长度 16位
校验和 16位
小结TCP与UDP的区别:
1.基于连接与无连接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;TCP是发送的是字节流,UDP是面向报文的模式
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
Socket与TCP、UDP、http的区别:
我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
JAVA TCP Socket编程模型:
相关推荐
SocketTool是一款强大的网络调试工具,专门用于TCP和UDP协议的测试与分析。它为开发者提供了便利的接口,以便于在应用程序中实现网络通信功能的调试和验证。在IT行业中,理解TCP和UDP这两种传输层协议至关重要,因为...
TCP & UDP Debug v1.032提供了一个友好的界面,帮助开发者创建和管理Socket,无论是TCP Socket还是UDP Socket,都能轻松应对。你可以设置不同的参数,如端口、缓冲区大小等,进行各种测试场景的模拟。 网络测试是...
SocketTestDlg)是卓岚公司开发的一款综合的TCP、UDP协议的调试软件,可以方便地调试各种网络设备,比如 Modbus TCP 设备、串口服务器等,支持文件发送、接收,界面简洁,稳定可靠,可16进制显示,还有定时发送功能,...
Socket通讯调试工具是一种重要的开发和测试工具,尤其在进行网络编程时,无论是TCP还是UDP协议,都有着不可或缺的作用。本文将详细介绍此类工具的功能、用途以及如何使用它们来优化和调试网络应用。 首先,Socket是...
3. **ss (socket statistics)**:用于查看系统中的TCP和UDP套接字状态,帮助分析网络连接。 **UDP测试工具**: 1. **hping3**:除了TCP,它还可以发送UDP、ICMP和 SCTP 数据包,进行端口扫描和性能测试。 2. **...
当尝试连接到错误的IP地址或端口时,如10.22.4.107 9001,TCP会报告Socket错误,因为无法建立有效的连接。 UDP(用户数据报协议)则是一种无连接的、不可靠的、基于数据报的传输层协议。它不保证数据的顺序、完整性...
本压缩包文件"TCP&UDP测试工具.rar"提供了一些实用工具,帮助开发者在进行socket或telnet相关的开发时,能够模拟简单的使用环境,对TCP和UDP协议进行测试。 TCP是一种面向连接的、可靠的传输协议,它通过三次握手...
关于多路SOCKET举例,在文档中有详细的介绍,以便于用户设计终端TCP/UDP应用。在设置格式和收发模式方面,AT指令的最后一个参数取值范围为(0,1,2,5),其中0为默认值。 4. 透传 透传模式下模块直接与服务器通信,...
在IT领域,网络通信是至关重要的部分,TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种最常用的传输层协议。本DEMO是用C/C++语言编写的,涵盖了TCP和UDP的客户端与服务器程序,旨在帮助...
"SocketTool4"可能是一款用于网络测试的工具,它可能包含了一系列用于TCP和UDP通信的实用程序,例如: 1. TCP连接测试:这类工具可以用来测试两个端点之间的TCP连接是否正常,检查端口是否开放,测量连接建立的时间...
本资源包含使用Socket类库以及TcpListener和UdpClient类实现的不同类型的TCP和UDP服务器代码示例,非常适合初学者和有经验的开发者深入理解网络通信机制。 首先,让我们详细了解一下TCP(传输控制协议)和UDP(用户...
源代码将展示如何使用VB的网络编程接口,如Socket类,来实现TCP和UDP的通信功能。实验报告可能详细解释了设计思路、实现方法、遇到的问题以及解决方案,对于学习网络编程和VB编程来说是非常有价值的参考资料。 总的...
软件介绍: Socket测试TCP、UDP测试小工具SocketTest,可设置本地工作模式与本地端口,目的IP及目的端口,设置接收区与发送区参数。发送数据时可增加奇偶校验。测试械:UDP组播/TCP客户端/UDP
TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种广泛使用的传输层协议,它们各有特点,适用于不同的应用场景。在这个"Android Tcp&Udp; demo"中,我们将深入探讨这两种协议在Android上...
本篇文章将深入探讨如何使用C#中的Socket类以及TcpListener和UdpClient来实现TCP和UDP服务器,同时也会讲解异步和同步两种编程模型。 首先,TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议...
TCP和UDP是网络通信中的两种基础传输协议,广泛应用于各种网络应用中。TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,而UDP(User Datagram Protocol)则是无连接的...
SocketTool2是一款强大的网络调试和开发工具,专用于TCP与UDP协议。在IT行业中,网络编程是不可或缺的一部分,尤其在构建分布式系统、实时通信应用以及互联网服务时。SocketTool2以其便捷的操作和丰富的功能,为...
TCP/UDP socket 调试工具 TCP/UDP socket 调试工具 SocketTool调试软件是一款网络TCP/UDP通信调试工具,本工具集功能强大与简单易用为一体,是无需安装的免费绿色软件。她可以帮助网络编程人员、网络维护人员检查所...
本教程将详细探讨Android应用如何使用TCP和UDP这两种常用网络传输协议与服务器进行通信。 首先,TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议。在Android中,我们通常使用Socket类来实现...