学习TCP/IP - TCP三次握手连接和四次握手断开连接

TCP连接

一、为什么需要TCP

  链路层将位流封装成数据帧,同时屏蔽了底层物理层的复杂性; 网络层定义了IP地址,划分了网段,使得源计算机可以快速找到目标计算机,但它无法保证数据准确到达. 所以在传输层定义了TCP协议,它是面向连接的可靠传输协议,

二、TCP如何建立连接

   2.1) TCP三次握手建立连接

  

  TCP三次握手创建连接

    a. 由于TCP是面向连接的,所以有服务端和客户端之分。服务端先在对应的端口监听(LISTENING), 等待客户端发送的tcp连接请求。

    b. A机器向B机器发起TCP连接的请求(SYN=1), 假设序列号seq=x, 此时A机器进入SYNC_SENT状态。

     c. B机器收到请求后,对A机器的TCP请求进行确认(SYN=1,ACK=1,ack=x+1), 该数据序列号假设为y, 此时B机器进入SYNC_RCVD。

    d. A机器对B机器的确认进行确认回复(ACK=1, ack=y+1), 该数据序列号为x+1。此时A机器进入ESTABLISHED状态。

    e. B机器收到之后,也进入ESTABLISHED状态, 此时两个机器已经建立了TCP连接,可以进行双向数据传输。

  2.2) 为什么需要三次握手,而不是两次

  (1) 确保双方信息对等

  

  (2) 防止因请求超时导致脏链接

    a. 第一次超时, 请求包仍在网络上传输

    b. A重复请求, B收到后建立连接,然后向A确认,A收到后,确认建立连接

    c. 双方交流完毕后,断开链接.

    d. 此时,B收到第一次超时的请求包,B会建立链接, A仍认为没有连接. 这时,就出现了脏连接

  

  两次握手建立连接会产生脏连接

  

三、TCP如何断开连接

   3.1) 四次握手断开连接

  

  TCP四次握手断开连接

     a. A发送完己方数据后(FIN=1), 主动请求关闭连接, 假设序列号seq=u,  此时A进入FIN_WAIT_1

    b. B收到请求后,需要向A回复确认(ACK=1, ack=u+1), 假设序列号seq=v, 此时B进入CLOSE_WAIT,

      为什么不立即关闭呢?因为是全双工通信, B的数据有可能尚未发送完毕

    c.  A收到确认之后进入FIN_WAIT_2

     d. B发送完数据之后(FIN=1), 向A发出信号, 假设数据序列号seq=w, (因为B会发送不定量的数据,所以序列号不确定),

      此时B进入LAST_ACK, 等待A的最后确认

    e. A收到B发完数据的消息后, 向B回复确认(ACK=1, ack=w+1),序列号seq=u+1, 此时A进入TIME_WAIT状态, 将会等待2MSL时间

       (RFC793规定MSL为2分钟, 实际会更小, 因为当前网络设施比较好)

    f. B收到之后, 即进入关闭状态CLOSED

    g. A等待了2MSL时间后, 没有收到B的任何数据,即进入关闭状态CLOSED

  3.2) 为什么要在TIME_WAIT等待2MSL时间?

    MSL是报文在网络上生存的最大时间,超过阀值便将报文丢弃。一般来说,MSL大于TTL衰减至0的时间。在TIME_WAIT等待2MSL有以下2个原因:

      (1) 确认被动关闭方能够顺利进入CLOSED状态

  如果A发出第4次握手的数据之后,直接进入CLOSED状态,当B没有收到第4次握手的数据时,会一直重发第3次握手的数据,由于A已经CLOSED,B不会停止重发数据。

       (2) 防止失效请求,确保本次连接中传输的数据消亡,避免失效连接的数据与正常连接的数据混淆

学习资料

  《码出高效 Java开发手册》 1.5.3 ,  1.5.4

    

 

  

原文地址:https://www.cnblogs.com/timfruit/p/10350654.html

时间: 2024-10-20 18:07:15

学习TCP/IP - TCP三次握手连接和四次握手断开连接的相关文章

TCP 三次握手建立连接,四次挥手断开连接,图解详细分析,有个疑点求帮忙解答????

继文章  http://blog.csdn.net/simonchi/article/details/41722511   之后,我觉得有必要来详细的说一下TCP的三次握手和四次挥手的过程,帮助大家理解这个过程. 首先来看一下tcpdump抓取的网络数据包,如何抓包分析参考 上面给出的链接 图中红色框选的是三次握手建立连接 第一次:客户端发送SYN报文,并设置seq=0, 第二次:服务端收到SYN报文,知道对方要求建立连接,发送SYN和ACK报文,并设置seq=0,ack=0(第一次的seq)+

利用tcpdump监控tcp连接三次握手和关闭四次握手

学习网络编程最主要的是能理解底层编程细节,一开始看<UNIX网络编程卷1:套接字联网API>的时候搞不懂什么seq.ack到底是什么东西,最近了解了tcpdump的一些用法后感觉两者结合起来还是比较容易理握手过程的.以下就通过tcpdump工具来监控相关内容,并和书本上的流程进行对比介绍,希望对入门的童靴有些帮助吧 服务端代码如下: #include <sys/socket.h> //socket listen bind #include <arpa/inet.h> /

TCP/IP的三次握手协议

关于TCP/IP的三次握手协议,这篇文章中有详细的介绍,很通俗易懂,什么时候忘了,都可以过来瞧两眼,保证很快就明白了. 首先TCP/IP协议分为三个阶段:建立连接(握手阶段),数据传输阶段,连接终止阶段. 看到以前学习的<计算机网络>课本,书上介绍,数据传输阶段的时候,突然想到QQ或者阿里旺旺是不是采用TCP/IP协议进行聊天的, 发现阿里旺旺应该是采用TCP/IP协议,但是QQ是采用UDP协议进行聊天的,采用TCP协议进行保持登录状态的.关于QQ采用的协议,可以参考这篇知乎问答 关于他们具体

TCP/IP协议三次握手和四次挥手大白话解说

TCP/IP协议三次握手和四次挥手大白话解说 前言 昨天晚上被一位师傅问到了TCP/IP的工作机制,心里很清楚三次握手,然而对于四次挥手却忘了,这是大学习里学过的,奋而翻阅书籍和网络对之前所学的做一个温顾,算是夯实自我吧. TCP(Transmission Control Protocol)网络传输控制协议,是一种面向连接的.可靠的.基于字节流的传输层通信协议,数据传输前建立连接的工作要经过三次握手,数据传输后断开连接的工作要经过四次挥手. 工作过程 TCP标志位: TCP共有6个标志位,分别是

TCP/IP的三次握手和四次握手 Dos攻击

TCP连接的状态图 TCP建立连接的三次握手过程,以及关闭连接的四次握手过程 贴一个telnet建立连接,断开连接的使用wireshark捕获的packet截图. 1.建立连接协议(三次握手) (1)客户 端发送一个带SYN标志的TCP报文到服务器.这是三次握手过程中的报文1. (2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志.因此它表示对刚才客户端SYN报文的回应:同时又标志SYN给客户端,询问客户端是否准备好进行数据通 讯. (3) 客户必须再次

十五大原理之零三--TCP/IP的三次握手和四次断开原理

重要的标志位含义: ACK:表示确认.只有当ACK标志位为1时,TCP报文的确认字段才有效. SYN:表示同步,在连接建立时用来同步序列号.当SYN=1而ACK=0时,表明这是一个连接请求报文.若对方同意建立连接时,则在响应报文中,应使SYN=1,ACK=1.因此,同步比特SYN置为1,就表明这是一个连接请求报文或连接接受响应报文. FIN:用于释放一个连接.当FIN位为1时,表明此报文段的发送端数据已发送完毕,并要求释放连接. 一.TCP/IP的三次握手 第一次握手:首先发送方主机向接收方主机

TCP/IP协议三次握手流程

一.TCP/IP 协议三次所握手: 所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立.在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示: 图2 TCP三次握手 (1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认.  (2)第二次握手:Server收

TCP/IP协议三次握手与四次握手流程解析(转)

一.TCP报文格式 下面是TCP报文格式图: 上图中有几个字段需要重点介绍下:  (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记.  (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1.  (3)标志位:共6个,即URG.ACK.PSH.RST.SYN.FIN等,具体含义如下:  (A)URG:紧急指针(urgent pointer)有效.  (B)ACK:确认序号有效.  (C)PSH:

抓包查看TCP/IP 的三次握手与四次分手

闲的无聊,自己折腾了个三次握手与四次分手,不正确的地方请大家批评 10.0.0.1 主机A10.0.0.200 主机B 1)由主机A向B发送建立TCP连接的请求报文,请求报文中SYN字段设置为1,表示需要建立tcp连接请求请求:Seq序列号,是由系统随机生成的2)主机B回复主机A发送的tcp连接请求报文,回复报文中SYN字段设置为1,ACK确认控制字段回复:重新生成一个新的Seq序列号,Ack验证数值由A请求的seq序列加13)主机A收到B的回复后回复B,回复ACK确认控制字段回复:Seq序列号

Tcp三次握手连接和四次挥手断开过程详解

TCP的连接建立是一个三次握手过程,目的是为了通信双方确认开始序号,以便后续 通信的有序进行.主要步骤如下: 1. 连接开始时,连接建立方(Client)发送SYN包,并包含了自己的初始序号a: 2. 连接接受方(Server)收到SYN包以后会回复一个SYN包,其中包含了对上一个a包 的回应信息ACK,回应的序号为下一个希望收到包的序号,即a+1,然后还包含 了自己的初始序号b: 3. 连接建立方(Client)收到回应的SYN包以后,回复一个ACK包做响应,其中包含了 下一个希望收到包的序号