⬜⬜⬜ (*^▽^*)欢迎光临 ⬜⬜⬜
✏️write in front✏️
个人主页:陈丹宇jmu
欢迎各位→点赞 + 收藏⭐️ + 留言
联系作者by QQ:813942269
致亲爱的读者:很高兴你能看到我的文章,希望我的文章可以帮助到你,祝万事顺意️
✉️少年不惧岁月长,彼方尚有荣光在
建议在文章界面右边的导航栏中选择隐藏侧边栏并显示文章目录
三次握手是TCP/IP协议中建立可靠连接的过程,其基本原理如下:
三次握手(Three-way Handshake)是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。
进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常;并且指定自己的ISN初始化序列号(Sequence Number)为后面数据的可靠性传输做准备。
三次握手实质上其实就是客户端请求连接服务器指定(传输层)端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息(windows size)以及最大段长MSS(单个TCP数据段中能够承载的最大有效载荷Payload大小等信息。
客户端与服务器端为建立连接之前:
刚开始客户端处于 Closed 的状态,服务端处于 Listen 状态。
进行三次握手:
第一次握手:
客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN(随机生成的)。此时客户端处于 SYN_SENT 状态。
客户端首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号。
第二次握手:
服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(随机生成的)。同时会把客户端的 ISN + 1 作为ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_RCVD 的状态。
服务器在确认报文段中SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y。
第三次握手:
客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方已建立起了连接。
确认报文段ACK=1,确认号ack=y+1,序号seq=x+1(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号。
发送第一个SYN的一端将执行主动打开(active open),接收这个SYN并发回下一个SYN的另一端执行被动打开(passive open)。
CLOSED
表示初始状态,TCP连接处在关闭状态。
LISTEN
这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听(Listen)状态,可以接受连接了。
SYN_RCVD
这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。
SYN_SENT
这个状态与SYN_RCVD遥相呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。
ESTABLISHED
这个容易理解了,表示连接已经建立了。
套接字(Socket)和TCP三次握手是网络通信中的两个重要概念,它们之间存在密切的关联。
在socket编程中,客户端执行connect()时,将触发三次握手。
TCP三次握手是建立TCP连接时使用的一种协议,用于确保通信双方都能够正常收发数据。在进行TCP三次握手时,客户端和服务器之间会使用各自的套接字来进行通信。
先看一下网络通信最初的过程,服务器端通过 socket(创建套接字),bind (绑定)和 listen(监听) 完成了被动套接字的准备工作,被动的意思就是等着别人来连接,然后调用 accept(等待请求),服务器端就会阻塞在这里,等待客户端的连接来临;客户端通过调用 socket (创建套接字)和 connect 函数之后,也会阻塞。接下来的事情是由操作系统内核完成的,更具体一点的说,是操作系统内核网络协议栈在工作。
- 客户端的协议栈向服务器端发送了 SYN 包,并告诉服务器端当前发送序列号 j,客户端进入 SYNC_SENT 状态;
- 服务器端的协议栈收到这个包之后,和客户端进行 ACK 应答,应答的值为 j+1,表示对 SYN 包 j 的确认,同时服务器也发送一个 SYN 包,告诉客户端当前我的发送序列号为 k,服务器端进入 SYNC_RCVD 状态;
- 客户端协议栈收到 ACK 之后,使得应用程序从 connect 调用返回,表示客户端到服务器端的单向连接建立成功,客户端的状态为 ESTABLISHED,同时客户端协议栈也会对服务器端的 SYN 包进行应答,应答数据为 k+1;
- 应答包到达服务器端后,服务器端协议栈使得 accept 阻塞调用返回,这个时候服务器端到客户端的单向连接也建立成功,服务器端也进入 ESTABLISHED 状态。
套接字(Socket)是计算机网络通信中一种抽象概念,它用于实现不同计算机之间或同一计算机内进程间的通信。套接字提供了一种接口,使得应用程序能够通过网络发送和接收数据。
在网络通信中,套接字可描述为一个网络连接的端点。套接字Socket由IP地址和端口号组成,其中IP地址用于标识网络中的主机,而端口号则用于标识主机上的具体进程。套接字就像是通信中的“插座”,连接到网络中的特定位置,以便数据的传输。
套接字(Socket)是在应用层和传输层之间建立起的一个抽象概念,用于实现网络上的进程间通信。套接字提供了一种机制,使得应用程序能够通过网络发送和接收数据。在TCP/IP协议栈中,套接字通常与传输层协议TCP关联。
套接字可以根据其类型分为两种常见的类型:流套接字(Stream Socket)和数据报套接字(Datagram Socket)。
流套接字(Stream Socket):基于传输控制协议(TCP),提供面向连接、可靠的、全双工的通信方式。它提供有序、无差错的数据传输,确保数据的可靠性和完整性。流套接字适用于需要稳定、可靠传输的场景,如文件传输、网页浏览等。
数据报套接字(Datagram Socket):基于用户数据报协议(UDP),提供无连接、不可靠的、不可靠的通信方式。它不提供可靠性保证,数据传输可能出现丢失、重复、乱序等情况。数据报套接字适用于对实时性要求较高、对数据准确性要求相对较低的场景,如音频/视频流传输、实时游戏等。
套接字在应用程序中通过编程接口(如套接字API)来创建、绑定、监听、连接和发送/接收数据等操作。不同编程语言提供了相应的套接字API,如C语言的Socket API、Python的socket模块等,开发者可根据需要选择合适的API进行套接字编程。
总之,套接字是计算机网络通信中实现进程间通信的一种抽象概念,它允许应用程序通过网络进行数据传输。通过套接字,不同端点的计算机可以建立连接并交换数据,实现网络通信的功能。
TCP(Transmission Control Protocol,传输控制协议)是一种常用的网络传输协议,它位于网络模型的传输层,提供可靠的、面向连接的数据传输。
TCP具有以下特点:
可靠性:TCP通过采用序列号(seq)、确认(ack)和重传机制来确保数据的可靠传输。接收方收到数据后会发送确认消息,发送方在一定时间内未收到确认消息时会重新发送数据,以确保数据的正确交付。
面向连接:在数据传输之前,TCP要先建立连接,即进行三次握手。这样可以确保通信双方的状态同步,维护一条可靠的通信线路,并在数据传输完成后进行连接的关闭。
流量控制:TCP通过使用滑动窗口机制来控制数据流量,确保发送方和接收方的数据处理能力匹配,避免因发送速度过快而导致接收方无法处理或丢失数据。
拥塞控制:TCP使用拥塞控制算法来监测网络的拥塞程度,并根据情况调整发送速率,以避免网络拥塞并保证整体性能。
面向字节流:TCP将数据视为一连串的字节流,不关心数据的具体内容和边界,通过序列号来标识和重组数据。
TCP在许多应用中被广泛使用,例如在Web浏览器中进行HTTP通信、电子邮件传输、文件传输等。它提供了可靠性和顺序性保证,适用于要求数据完整性和可靠性的应用场景。
Window Size、MSS 和 MTU 在 TCP 数据传输中协同作用,以确保高效的数据传输和避免分片(Fragmentation)的发生。
Window Size(窗口大小):用于流量控制和拥塞控制。它表示接收方允许发送方在没有收到确认ACK之前发送的字节数量。发送方根据窗口大小来限制自己发送的数据量,以防止过多的数据堆积在网络中,造成拥塞。如果窗口大小更大,发送方就可以发送更多的数据段。窗口大小可以动态调整,以适应网络情况的变化。
MSS(最大段长):是 TCP 协议中的一个参数,指定在单个 TCP 数据段中能够承载的最大有效载荷(Payload)大小。MSS 的值取决于通信双方的能力和网络设备的限制。通常情况下,MSS 的值会根据网络路径的 MTU 进行调整。
MTU(最大传输单元):是指在某个网络中能够一次性传输的最大数据包长度。每个网络链路或设备都有自己的 MTU 值,对数据包的大小有限制。当一个数据包的大小超过了某个网络链路或设备的 MTU 值,就需要进行分片,将数据包拆分成多个小片段进行传输。
这三者的协同作用如下:
综合来说,MSS 和 窗口大小都是为了控制发送方发送数据的速率和数量,而 MTU 则是为了确保数据包能够在网络中顺利传输而进行分片。它们相互配合,以提供高效、可靠的 TCP 数据传输。
要想能深入理解三次握手的深刻内涵,熟悉TCP头部的报文格式必不可少,只有深刻认识和了解到了TCP头部报文每一个字段的内容和含义,结合抓包分析工具,更加深刻地认识到三次握手的过程。
TCP头部报文字段是TCP协议在数据传输过程中用来控制和管理数据包的信息。以下是TCP头部报文的一些常见字段:
源端口(Source Port):16位字段,表示发送方的端口号。
目标端口(Destination Port):16位字段,表示接收方的端口号。
序列号(Sequence Number):32位字段,表示发送方发送的数据字节流的序列号。
确认号(Acknowledgment Number):32位字段,表示接收方期望接收的下一个数据字节流的序列号。
数据偏移(Data Offset):4位字段,表示TCP头部的长度,以4字节为单位。
控制位(Flags):6位字段,包括以下标志位:
- URG(Urgent):表示紧急指针字段是否有效。
- ACK(Acknowledgment):表示确认号字段是否有效。
- PSH(Push):表示接收方应该尽快将数据交给应用程序。
- RST(Reset):表示中断连接。
- SYN(Synchronize):表示发起连接请求。
- FIN(Finish):表示结束连接。
窗口大小(Window Size):16位字段,表示接收方可接收的数据量大小,用于流量控制。
校验和(Checksum):16位字段,用于检测TCP头部和数据是否有错误。
紧急指针(Urgent Pointer):16位字段,在URG标志位有效时指示紧急数据的位置。
选项(Options):可变长度的字段,用于传递一些额外的控制信息,如最大段长度、时间戳等。
这些字段共同组成了TCP头部报文,通过对这些字段的设置和解析,TCP协议能够实现可靠的数据传输和连接管理。
三次握手过程中比较需要注意的TCP头部报文字段有:
考虑到阅读篇幅,更多实验内容参考本专栏中的其他文章
欢迎各位→点赞 + 收藏⭐️ + 留言
写给读者:很高兴你能看到我的文章,希望我的文章可以帮助到你,祝万事顺意️