精华内容
下载资源
问答
  • 三次握手详解: 客户端给服务端发起连接请求,SYN,并发送一个随机...四次挥手详解: 客户端给服务端发起断开请求,FIN,并发送一个随机序列号seq,ack为前面会话内容的确认信息。 服务端确认客户端的请求信息seq...

    三次握手详解:

    1. 客户端给服务端发起连接请求,SYN,并发送一个随机序列号seq。

    2. 服务端反馈给客户端信息表示确认seq+1,并发送一个随机序列号seq。

    3. 然后客户端给服务端再次确认信息(seq+1)+1,并发送一个随机序列号seq。

    四次挥手详解:

    1. 客户端给服务端发起断开请求,FIN,并发送一个随机序列号seq,ack为前面会话内容的确认信息。
    2. 服务端确认客户端的请求信息seq+1,并发送一个随机序列号seq。
    3. 服务端再给客户端发送一个断开的请求,并发送一个随机序列号seq。
    4. 客户端确认断开请求,并发送一个随机序列号seq。

    展开全文
  • 涉及到的知识点有:1、TCP、UDP 协议的区别2、TCP 头部结构3、三次握手四次挥手过程详解4、什么是 TIME_WATI 状态 本文略长,需要有点耐心一、TCP、UDP 协议的区别 在介绍这两者的区别之前,我们要需要了解一个...

    2c65b130ebe5b5506e6174148c50c39f.png

    今天来聊聊面试频率特别高的一个题目:TCP 协议中的三次握手与四次挥手。涉及到的知识点有:

    1、TCP、UDP 协议的区别
    2、TCP 头部结构
    3、三次握手与四次挥手过程详解
    4、什么是 TIME_WATI 状态

    本文略长,需要有点耐心

    一、TCP、UDP 协议的区别

    在介绍这两者的区别之前,我们要需要了解一个概念:TCP/IP 协议族。定义如下:

    目前 Internet(因特网)使用的主流协议族是 TCP/IP 协议族,它是一个分层、多协议的通信体系 《Linux高性能编程》

    提取关键词:分层、多协议和通信。也就是说,它有多个层次,每个层次有不同的协议,这些层次之间通过协议相互协作,最终达到网络通信的目的。

    说到分层,应该不会很陌生,TCP/IP 协议族是一个四层协议系统,自底而上分别是:数据链接层、网络层、传输层、应用层。我们这里要说到的 TCP 和 UDP 协议属于传输层。(各层的作用及相关协议这里暂时先不做介绍)

    下面我们回到标题:TCP、UDP 协议的区别,总结起来这个问题的答案要点如下:

    1、首页它们俩都是传输层的协议,而所谓“传输层”,它是为两台主机提供端到端的通信,即从 A <-> B 。

    2、TCP 协议可靠,UDP 协议不可靠。可靠即指数据由 A 发送到 B,是否能确保数据真的有送达到 B。TCP 协议使用 超时重传、数据确认等方式来确保数据包被正确地发送至目的端,而 UDP 协议无法保证数据从发送端正确传送到目的端,如果数据在传输过程中丢失、或者目的端通过数据检验发现数据错误,则 UDP 协议只是简单地通知应用程序发送失败,对于 TCP 协议拥有的超时重传、数据确认等需要应用程序自己来处理这些逻辑。

    3、TCP 是面向连接的,UDP 是无连接的。这也比较好理解,因为 TCP 连接才需要“三次握手,四次挥手”。

    4、TCP 服务是基于流的,而 UDP 是基于数据报的,基于流的数据没有边界(长度)限制,而基于数据报的服务,每个 UDP 数据报都有一个长度,接收端必须以该长度为最小单位将其所有内容一次性读出。

    5、当发送方多次执行写操作时,TCP 模块会先将这些数据放入 TCP 发送缓冲区中,当 TCP 模块真正开始发送数据时,发送缓冲区中这些等待发送的数据可能被封装成一个或多个 TCP 报文段发出,因此,TCP 模块发出的 TCP 报文段的个数与应用程序执行的写操作次数是没有固定数量关系的。同样,当接收端收到一个或多个 TCP 报文段后,TCP 模块将这些数据按照序号(序号说明见下面 的 TCP 头部结构)依次放入 TCP 接收缓冲区中,并通知应用程序读取数据。接收端可选择一次或者分多次将数据从缓冲区中读出(这取决于用户指定的应用程序读缓冲区的大小)。因此,接收端读取数据的次数与发送端发出多少个报文段个数也没有固定的数量关系。总结来说,即对于 TCP 连接,发送端执行的写操作次数与接收端执行的读操作次数之间没有任何数据关系,这也是基于流服务的特点。而对于 UDP 服务,发送端每执行一次写操作,就会将其封装成一个 UDP 数据报并发送之,同时接收端必须根据发送的进行读,否则就会丢包。因此,对于 UDP 连接,发送端写的次数据与读的次数是一致的,这也是基于数据报的服务的特点

    6、TCP 的连接是一对一的,所以如果是基于广播或者多播的的应用程序不能使用 TCP,而 UDP 则非常适合广播和多播。

    总结一句定义:

    TCP 协议(Transmission Control Protocal,传输控制协议)为应用层提供可靠的、面向连接的、基于流的服务。而 UDP 协议(User Datagram Protocal,用户数据报协议)则与 TCP 协议完全相反,它为应用层提供不可靠、无连接和基于数据报的服务

    二、TCP 头部结构

    TCP 报文结构分为头部部分和数据部分,为什么需要了解 TCP 头部结构,因为在后面“三次握手与四次挥手”里会用到头部结构里的标志位。简单了解下对理解后面的过程有一定的好处。

    下面一一说明每个的作用:
    16位源端口号与目的端口号,这个比较好理解,就不过多解释。

    32位序号:该序号为生成的随机值 ISN 加上该段报文段所携带的数据的第一个字节在整个字节流中的偏移量。比如,某个 TCP 报文段发送的数据是字节流中的第 100 ~ 200 字节,那该序号为 ISN + 100

    4位头部长度:标识 TCP 头部有多少个 32 bit 字,因为是 4位,即 TCP 头部最大能表示 15,即最长是 60 字节。即它是用来记录头部的最大长度。

    6位标志位,包括:
    URG 标志:表示紧急指针是否有效。ACK 标志:确认标志。通常称携带 ACK 标志的 TCP 报文段为确认报文段。
    PSH 标志:提示接收端应该程序应该立即从 TCP 接收缓冲区中读走数据,为接收后续数据腾出空间(如果不读走,数据就会一直在缓冲区内)。
    RST 标志:表示要求对方重新建立连接。通常称携带 RST 标志的 TCP 报文段为复位报文段SYN 标志:表示请求建立一个连接。通常称携带 SYN 标志的 TCP 报文段称为同步报文段FIN 标志:关闭标志,通常称携带 FIN 标志的 TCP 报文段为结束报文段这些标志位说明了当前请求的目的,即要干什么。

    16 位窗口大小:表示当前 TCP 接收缓冲区还能容纳多少字节的数据,这样发送方就可以控制发送数据的速度,它是 TCP 流量控制的一个手段。

    16 位校验和:验证数据是否损坏,通过 CRC 算法检验。这个校验不仅包括 TCP 头部,也包括数据部分。

    16 位紧急指针:正的偏移量,它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。TCP 的紧急指针是发送端向接收端发送紧急数据的方法。

    TCP 头部选项:可变长的可选信息,这部分最多包含 40 字节,因为 TCP 头部最长是 60 字节,所以固定部分占 20 字节。这里不做详细介绍,可以参考《Linux高性能编程》3.2.2

    三、三次握手与四次挥手过程详解

    46a3daf4affbd61e116cb52b84d049d4.png

    先来解释三次握手过程:

    1、发送端发送连接请求,6位标志为 SYN,同时带上自己的序号(此时由于不传输数据,所以不表示字节的偏移量),比如是 223。

    2、接收端接到请求,表示同意连接,发送同意响应,带上 SYN + ACK 标志位,同时将确认序号为 224(发送端序号加1),并带上自己的序号(此时同样由于不传输数据,所以不表示字节的偏移量),比如是 521。

    3、发送端接收到确认信息,再发回给接收端,表示我已接受到你的确认信息,此时标志仍为 ACK,确认序号为 522。

    涉及到的问题:为什么是三次握手,而不是四次或者两次?

    首先解释为什么不是四次。四次的过程是这样的:

    发送方:我要连你了。
    接收方:好的。
    接收方:我准备好了,你连吧。
    发送方:好的。

    显然接收方准备好连接并同意连接是可以合并的,这样可以提高连接的效率。

    再来,我们解释为什么不是两次。其实也比较好理解,我们知道 TCP 是全双工通信的,同时也是可靠的,连接和关闭都是两边都要执行才算真正的完成,同时还需要确保两端都已经执行了连接或者关闭。如果只有两次,过程是这样的:

    发送方:我要连你了。
    接收方:好的。

    很明显,接收方并不知道也不能保证发送方一定接收到 “好的” 这条信息,一旦接收方真的没有收到这条信息,就会出现接收收“单方面连接”的情况,这个时候发送方就会一直重试发送连接请求,直到真正收到 “好的” 这条信息之后才算连接完成。而对于三次,如果发送方没有等待到你回复确认,它是不会真正处于连接状态的,它会重试确认请求。

    接着我们来看看四次挥手过程:

    1、发送方发送关闭请求,标志位为:FIN,同时也会带上自己的序号(此时同样由于不传输数据,所以不表示字节的偏移量)。

    2、接收方接到请求后,回复确认:ACK,同时确认序号为请求序号加1。

    3、接收方也决定关闭连接,发送关闭通知,标志位为 FIN,同时还会带上第2步中的确认信息,即 ACK,以及确认序号和自己的序号。

    4、发送方回复确认信息:ACK,接收方序号加1。

    涉及到的问题:为什么需要四次握手,不是三次?

    三次的过程是这样的:

    发送方:我不再给你发送数据了。
    接收方:好的,我也不给你发了。
    发送方:好的,拜拜。

    这是因为当接收方收到关闭请求后,它能立马响应的就是确认关闭,它这里确认的是接收方的关闭,即发送方不再发数据给接收方了,但他还是可以接收接收方发给他的数据。而接收方是否需要关闭“发送数据给发送方”这条通道,取决于操作系统。操作系统也有可能 sleep 个几秒再关闭,如果合并成三次,就可能造成接收方不能及时收到确认请求,可能造成超时重试等情况。因此需要四次。

    四、什么是 TIME_WAIT 状态

    首先,我们来看一段代码(说了这么多理论,终于要看点代码了)。这里举一个 python 简单的使用 socket 进行 tcp 通信的示例:

    服务端:

    socket_server_test.py
    
    # -*- coding: utf-8 -*-
    """
    @Time    : 2019/6/26 下午4:58
    @Author  : Demon
    @File    : socket_server_test.py
    @Desc    : 
    """
    
    import socket
    
    HOST = '127.0.0.1'  # 标准的回环地址 (localhost)
    PORT = 9999        # 监听的端口 (非系统级的端口: 大于 1023)
    
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 第三个参数,如果为0,也不可复用
    # 第三个如果为1,可以复用
    # s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            print("data:", data)
            if data:
                print("close")
                s.close()
                break
            conn.sendall(data)
    

    客户端:

    # -*- coding: utf-8 -*-
    """
    @Time    : 2019/6/26 下午4:55
    @Author  : yrr
    @File    : socket_client_test.py
    @Desc    : 测试 self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    """
    
    import socket
    
    HOST = '127.0.0.1'  # 服务器的主机名或者 IP 地址
    PORT = 9999        # 服务器使用的端口
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)
    
    print('Received', repr(data))
    

    执行效果:

    我们会发现,当我们服务端主动关闭时,如果我们再次运行这个程序,会报错误说端口仍然被占用。这就很奇怪了,明明已经关闭了连接,为什么还会占用着端口呢?我们使用 netstat -an|grep 9999 命令查看,发现当前这个连接处于 TIME_WAIT 状态。

    我们来说下 TIME_WAIT 状态。即当一方断开连接后,它并没有直接进入 CLOSED 状态,而是转移到 TIME_WAIT 状态,在这个状态,需要等待 2MSL(Maximum Segment Life,报文段最大生存时间)的时间,才能完全关闭。

    涉及问题:
    1、为什么需要有 TIME_WAIT 状态存在?

    简单来说有两点原因如下:

    a. 当最后发送方发出确认信息后,仍然不能保证接收方能收到信息,万一没收到,那接收方就会重试,而此时发送方已经真正关闭了,就接受不到请求了。

    b. 如果发送方在发出确认信息后就关闭了,在接收方接到确认信息的过程中,发送方是有可能再次发出连接请求的,那这个时候就乱套了。刚连接完,又收到确认关闭的信息。

    2、为什么时长是 2MSL 呢?
    这个其实也比较好理解,所以我发送确认信息,到达最长时间是 MSL,而你如果没接受到,再重试,时间最长也是 MSL,那我等 2MSL,如果还没收到请求,证明你真的已经正常收到了。

    正因为我们有这个 TIME_WAIT 状态,所以通常我们说是客户端先关闭,一般不会让服务器端先关闭。那如何避免出现关闭后端口被占用的情况(即上面代码示例问题怎么解决)呢?很简单,加一行代码即可实现:

    # socket.SO_REUSEADDR 表示 close 后端口可复用
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    3996df51a1d70696a1f699c4a335eddd.png
    展开全文
  • 在了解三次握手四次挥手之前,先要知道TCP报文内部包含了那些东西。熟悉了解TCP报文对日后学习网络和排除方面有很大的帮助,所以,今天为了加深对三次握手的理解,从新去认识TCP报文格式。TCP报文格式TCP报文详解...

    在了解三次握手和四次挥手之前,先要知道TCP报文内部包含了那些东西。熟悉了解TCP报文对日后学习网络和排除方面有很大的帮助,所以,今天为了加深对三次握手的理解,从新去认识TCP报文格式。

    ce8f799d278f89e14989e3cd04dbcb3d.png

    TCP报文格式

    TCP报文详解

    TCP报文由首部和数据两部分组成。首部一般由20-60字节(Byte),长度可变。其中前20B格式固定,后40B为可选。

    因为,TCP报文还得传给下层网络层,封装成IP包,而一个IP包最大长度为65535,同时IP包首部也包含最少20B,所以一个IP包或TCP包可以包含的数据部分最大长度为65535-20-20=65495B。

    1、源端口号(Source Port)

    长度为16位,指明发送数据的进程

    2、目的端口(Destination Port)

    长度为16位,指明目的主机接收数据的进程

    3、序号(Sequence Number)

    也称为序列号,长度为32位,序号用来标识从TCP发送端向接入端发送的数据字节流进行编号,可以理解成对字节流的计数。

    4、确认号

    长度为32位,确认号包含发送确认的一端所期望收到的下一个序号。确认号只有在ACK标志为1时才有效。

    5、首部长度

    长度为4位,用于表示TCP报文首部的长度。用4位(bit)表示,十进制值就是[0,15],一个TCP报文前20个字节是必有的,后40个字节根据情况可能有可能没有。如果TCP报文首部是20个字节,则该位应是20/4=5

    6、保留位(Reserved)

    长度为6位,必须是0,它是为将来定义新用途保留的。

    7、标志(Code Bits)

    长度为6位,在TCP报文中不管是握手还是挥手还是传数据等,这6位标志都很重要。6位从左到右依次为:

    URG:紧急标志位,说明紧急指针有效;

    ACK:确认标志位,多数情况下空,说明确认序号有效

    PSH:推标志位,置位时表示接收方应立即请求将报文交给应用层

    RST:复位标志,用于重建一个已经混乱的连接;

    SYN:同步标志,该标志仅在三次握手建立TCP连接时有效

    FIN:结束标志,带该标志位的数据包用于结束一个TCP会话。

    8、窗口大小(window Size)

    长度为16位,TCP流量控制由连接的每一端通过声明的窗口大小来提供。

    9、检验和(Checksum)

    长度为16位,该字段覆盖整个TCP报文端,是个强制性的字段,是由发送端计算和存储,到接收端后,由接收端进行验证。

    10、紧急指针(Urgent Pointer)

    长度为16位,指向数据中优先部分的最后一个字节,通知接收方紧急数据的长度,该字段在URG标志置位时有效

    11、选项(Options)

    长度为0-40B(字节),必须以4B为单位变化,必要时可以填充0。

    12、数据

    在了解TCP报文格式,通过捕捉一个TCP报文直观感受一下。

    f9458264a204230331e019d4f7f41e48.png

    三次握手

    建立TCP连接时,需要客户端和服务器共发送3个包。

    606d9c8e405b93f9b7b69f69781ad5c6.png

    1、客户端主动打开,发送连接请求报文段,将SYN标识位置为1,Sequence Number置为x(TCP规定SYN=1时不能携带数据,x为随机产生的一个值),然后进入SYN_SEND状态。

    2、服务器收到SYN报文段进行确认,将SYN标识位置为1,ACK置为1,Sequence Number置为y,Acknowledgment Number置为x+1,然后进入SYN_RECV状态,这个状态被称为半连接状态。

    3、客户端再进行一次确认,将ACK置为1(此时不用SYN),Sequence Number置为x+1,Acknowledgment Number置为y+1发向服务器,最后客户端与服务器都进入ESTABLISHED状态

    为了加深对TCP三次握手的理解,抓包看一下TCP三次握手的过程。

    21027abd176e932d7a47371257002218.png

    TCP三次握手

    从抓包结果看来,整个过程符合TCP三次握手的预期:

    1. 客户端发送SYN给服务端
    2. 服务端返回SYN+ACK给客户端
    3. 客户端确认,返回ACK给服务端

    TCP四次挥手

    TCP四次挥手则是TCP连接释放的过程下面是TCP四次挥手的流程图:

    857a1a6c0c217944c93745f0ba9a3e99.png

    当客户端没有数据再需要发送给服务端时,就需要释放客户端的连接,这整个过程为:

    1、客户端发送一个报文给服务端(没有数据),其中FIN设置为1,Sequence Number置为u,客户端进入FIN_WAIT_1状态。

    2、服务端收到来自客户端的请求,发送一个ACK给客户端,Acknowledge置为u+1,同时发送Sequence Number为v,服务端年进入CLOSE_WAIT状态。

    3、服务端发送一个FIN给客户端,ACK置为1,Sequence置为w,Acknowledge置为u+1,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态。

    4、客户端收到FIN后,进入TIME_WAIT状态,接着发送一个ACK给服务端,Acknowledge置为w+1,Sequence Number置为u+1,最后客户端和服务端都进入CLOSED状态。

    为了加深对TCP四次挥手的理解,抓包看一下TCP四次挥手的过程。

    c2871096ff7791343d0afa0ad7adf4f3.png

    为什么三次握手和四次挥手?

    三次握手时,服务器同时把ACK和SYN放在一起发送到了客户端那里。

    四次挥手时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方 ACK 和 FIN 一般都会分开发送。

    展开全文
  • TCP三次握手四次挥手详解

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   

    经典的三次握手示意图:(#add,“握手”即图中左边到右边的连线

    经典的四次握手关闭图:


    TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

    位码即tcp标志位,有6种标示:

    SYN(synchronous建立联机)

    ACK(acknowledgement 确认)

    PSH(push传送)

    FIN(finish结束)

    RST(reset重置)

    URG(urgent紧急)

    Sequence number(顺序号码)

    Acknowledge number(确认号码)


    第一次握手:主机A发送位码为syn=1,随机产生seqnumber=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

    第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包

    第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

    完成三次握手,主机A与主机B开始传送数据。


    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
    第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
    第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态;

    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.

    实例:

    IP 192.168.1.116.3337 > 192.168.1.123.7788: S3626544836:3626544836
    IP 192.168.1.123.7788 > 192.168.1.116.3337: S 1739326486:1739326486 ack3626544837
    IP 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487,ack 1

    第一次握手:192.168.1.116发送位码syn=1,随机产生seqnumber=3626544836的数据包到192.168.1.123,192.168.1.123由SYN=1知道192.168.1.116要求建立联机;

    第二次握手:192.168.1.123收到请求后要确认联机信息,向192.168.1.116发送acknumber=3626544837,syn=1,ack=1,随机产生seq=1739326486的包;

    第 三次握手:192.168.1.116收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,192.168.1.116会再发送ack number=1739326487,ack=1,192.168.1.123收到后确认seq=seq+1,ack=1则连接建立成功。

    图解:
    一个三次握手的过程(图1,图2)

    (图1)

    (图2)

    第一次握手的标志位(图3)
    我们可以看到标志位里面只有一个同步位,也就是在做请求(SYN)

    (图3)

    第二次握手的标志位(图4)
    我们可以看到标志位里面有两个确认位和同步位,也就是在做应答(SYN + ACK)

    (图4)

    第三次握手的标志位(图5)
    我们可以看到标志位里面只有一个确认位,也就是再做再次确认(ACK)

    (图5)

    一个完整的三次握手也就是 请求---应答---再次确认

    四次分手:

    由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

    (1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。

    (2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。

    (3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。

    (4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

     

    1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

    这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你不可以马上关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的

    2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

    这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

     

               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    展开全文
  • 涉及到的知识点有:1、TCP、UDP 协议的区别2、TCP 头部结构3、三次握手四次挥手过程详解4、什么是 TIME_WATI 状态本文略长,需要有点耐心一、TCP、UDP 协议的区别在介绍这两者的区别之前,我们要需要了解一个概念...
  • 为什么建立连接是三次握手,关闭连接确是四次挥手呢? 建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。 而关闭连接时,服务器收到对方的FIN报文时...
  • 6-第六次实验-wireshark抓包图解TCP三次握手四次挥手详解.docx
  • 四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。 思考: 1、 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢? 这是因为服务端的LISTEN状态下的...
  • 该文档详细描述了wireshark抓包分析tcp三次握手四次挥手详解及网络命令,亲自整理,适合新手借鉴
  • 划重点: TCP(传输控制协议)和IP(网际协议) 是最先定义的两个核心协议,所以才统称为TCP/IP协议族 TCP的三次握手四次挥手 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,在发送数据前,通信双方...
  • 上次我们说TCP协议是一个可靠的传输层协议,它的可靠性主要分为四点①建立连接(三次握手)②确认重传③流量控制,滑动窗口④断开连接(四次挥手)上次我们说到TCP通过包头信息中的序列号和确认号保证能够完全接受...
  • 传输层tcp.udp以及三次握手四次挥手详解 大家好,本篇我们主要探讨TCP/IP模型的传输层,传输层协议主要包括TCP 和UDP,下面请仔细阅读 SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN...
  • 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程....所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个
  • TCP 三次握手四次挥手详解

    千次阅读 2018-12-26 15:37:09
    所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。 三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP窗口大小信息。 在...
  • 1)三次握手 服务器端对新的客户端都会置于LISTEN状态。 第一次握手,客户端给服务端发出连接请求报文,SYN=1,seq=x,客户端状态变为SYN_SENT。 第二次握手,服务器接收到连接请求报文后,同样发送确认报文给...
  • 最近在学习Linux的时候,发现TCP的三次握手四次挥手这里,面试问的特别频繁,觉得有必要留下我复习的痕迹,等将来自己想看的时候能找着地方 一、TCP协议特点 传输控制协议:面向连接,可靠传输,面向节流 二、三次...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,400
精华内容 560
关键字:

三次握手四次挥手详解