`
chriszeng87
  • 浏览: 738869 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[转]TCP/IP三次握手

阅读更多

TCP握手协议
  在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状态,完成三次握手。
  完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:
   未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN 包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器 进入ESTABLISHED状态。
Backlog参数:表示未连接队列的最大容纳数目。
  SYN-ACK 重传次数 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超 过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。
半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。 
====================================================================
  现在,我们来看一个完整的流程,在一个TCP socket上系统调用connect究竟是如何建立起一个到对端的连接的。我们还是以实验环境172.16.48.2向172.16.48.1的端口5002发起连接请求为例。
    第一步,172.16.48.2向172.16.48.1发起连接请求,发送一个SYN段,指明目的端口5002,通告自己的初始序号(ISN,由协议栈 随机产生的一个32位数),设置确认序号为0(因为还没有收到过对端的数据),通告自己的滑动窗口大小为5840(对端是5792,这似乎有问题,有待进 一步细查),窗口扩大因子为2(在首部选项中),通告最大报文段长度为1460(本地局域网),下面是数据内容(已剥去链路层的以太网首部和网络层的IP 首部):
        数据内容                            含义
基本首部
        80 0e                               源端口(32782)
        13 8a                               目的端口(5002)
        00 00 07 bc                         初始序号ISN
        00 00 00 00                         确认序号
        a                                   首部长度
        0 02                                标志位,SYN=1
        16 d0                               滑动窗口大小(5840)
        64 9e                               校验和
        00 00                               紧急指针
TCP选项
        02 04 05 b4                         最大报文段长度(1460)
        04 02                               允许SACK
        08 0a 00 0a 79 14 00 00 00 00       时间戳(0x000a7914),回显时间戳(0)
        01                                  占位。
        03 03 02                            窗口扩大因子(2)
    第二步,172.16.48.1收到请求包,检查标志位,发现SYN=1,认为这是一个初始化连接的请求,回应这个SYN,同时也发送自己的SYN段(即 ACK,SYN同时置位)。因为SYN本身要占用一个序号(还有标志FIN也要占用一个序号)。所以,确认序号设置为172.16.48.2的ISN加1 (即172.16.48.1期望收到来自172.16.48.2的下一个包的第一个序号为0x07bd。同时也要通告自己的初始序号,滑动窗口大小,窗口 扩大因子,最大报文段长度等,下面是数据内容:
        数据内容                            含义
基本TCP首部
        13 8a                               源端口(5002)
        80 0e                               目的端口(32782)
        98 8e 40 91                         初始序号ISN
        00 00 07 bd                         确认序号(对端ISN+1)
        a                                   首部长度
        0 12                                标志位,ACK=1, SYN=1
        16 a0                               滑动窗口大小
        65 d7                               校验和
        00 00                               紧急指针
TCP选项
        02 04 05 b4                         最大报文段长度(1460)
        04 02                               允许SACK
        08 0a 00 3c 25 8a 00 0a 79 14       时间戳(0x003c258a),回显时间戳(000a7914)
        01                                  占位
        03 03 02                            窗口扩大因子(2)
    第三步,172.16.48.2对来自172.16.48.1的SYN段进行确认,至此,TCP三次握手协议完成,连接建立,在172.16.48.2收 到SYN段时,将自己对应的socket的状态由TCP_SYN_SENT改为TCP_ESTABLISHED,进入连接建立状态,下面是数据内容:
        数据内容                            含义
        80 0e                               源端口(32782)
        13 8a                               目的端口(5002)
        00 00 07 bd                         序号(已不是ISN了)
        98 8e 40 92                         确认序号(对端ISN+1)
        8                                   首部长度(8*4=32,有12字节的选项)
        0 10                                标志,ACK=1
        05 b4                               滑动窗口大小(1460,有问题?待确认)
        a5 8a                               校验和
        00 00                               紧急指针
        01                                  占位
        01                                  占位
        08 0a 00 0a 79 14 00 3c 25 8a       时间戳(0x0a007914), 回显时间戳(0x003c258a)
=====================================================================
7、简述TCP三次握手过程,并说明为什么要3次握手
TCP 使用三次握手的主要原因就是要消除旧有连接中的SYN消息对新连接的干扰。
比如上次客户端A发起连接的请求SYN a,但可能数据包在网络中没有丢失而是被延时了,然后当A端定时器超时后,它将重发包含SYN c的请求数据包。因为IP包可能在网络中被延时,上次连接中发送的SYN报文可能在此时到达服务器端B,所以接收端不能对SYN的有效性作出判断,他必须询问对方A来确认这个SYN。
   当A受到B对本段SYN c的回应,知道B端收到了旧的连接请求,将在回应的数据包中加入RST,用于告诉B端SYN c是一个旧的连接请求。RST消息就是为了消除旧的连接中的SYN消息对连接的干扰,设置了一个特殊的消息。
   如果收到RST消息的TCP连接处于非同步状态(如SYN-SENT,SYN-RECEIVED),TCP连接将返回LISTEN状态。如果收到RST消息的TCP处于同步的状态(ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT),TCP连接将退出这个连接并通知对方自己已经退出连接。
TCP 连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。以下步骤概述了通常情况下客户端计算机联系服务器计算机的过程:
1. 客户端向服务器发送一个SYN置位的TCP报文,其中包含连接的初始序列号x和一个窗口大小(表示客户端上用来存储从服务器发送来的传入段的缓冲区的大小)。
2. 服务器收到客户端发送过来的SYN报文后,向客户端发送一个SYN和ACK都置位的TCP报文,其中包含它选择的初始序列号y、对客户端的序列号的确认x+1和一个窗口大小(表示服务器上用来存储从客户端发送来的传入段的缓冲区的大小)。
3. .客户端接收到服务器端返回的SYN+ACK报文后,向服务器端返回一个确认号y+1和序号x+1的ACK报文,一个标准的TCP连接完成。
TCP 使用类似的握手过程来结束连接。这可确保两个主机均能完成传输并确保所有的数据均得以接收
TCP Client Flags TCP Server 
1 Send SYN (seq=x) ----SYN---> SYN Received 
2 SYN/ACK Received   ACK Received, Connection Established  
w: ISN (Initial Sequence Number) of the Client 
x: ISN of the Server  

==========================================================
  握手阶段:   
  序号 方向   seq                           ack                         
  1  A->B           10000                           0           
  2         B->A           20000                         10000+1=10001         
  3         A->B           10001                         20000+1=20001   
  解释:   
  1:A向B发起连接请求,以一个随机数初始化A的seq,这里假设为10000,此时ACK=0   
    
  2:B收到A的连接请求后,也以一个随机数初始化B的seq,这里假设为20000,意思是:你的请求我已收到,我这方的数据流就从这个数开始。B的ACK是A的seq加1,即10000+1=10001   
    
  3:A收到B的回复后,它的seq是它的上个请求的seq加1,即10000+1=10001,意思也是:你的回复我收到了,我这方的数据流就从这个数开始。A此时的ACK是B的seq加1,即20000+1=20001   
    
    
  数据传输阶段:   
  序号  方向      seq                                     ack                       size   
  23           A->B                       40000                                   70000                     1514   
  24           B->A                       70000                     40000+1514-54=41460       54   
  25           A->B                       41460                     70000+54-54=70000           1514   
  26           B->A                       70000                     41460+1514-54=42920       54   
  解释:   
  23:B接收到A发来的seq=40000,ack=30000,size=1514的数据包   
  24:于是B向A也发一个数据包,告诉B,你的上个包我收到了。B的seq就以它收到的数据包的ACK填充,ACK是它收到的数据包的SEQ加上数据包的大小(不包括以太网协议头,IP头,TCP头),以证实B发过来的数据全收到了。   
  25:A在收到B发过来的seq为41460的数据包时,一看到41460,正好是它的上个数据包的seq加上包的大小,就明白,上次发送的数据包已安全 到达。于是它再发一个数据包给B。这个正在发送的数据包的seq也以它收到的数据包的ACK填充,ACK就以它收到的数据包的seq(70000)加上包 的size(54)填充,即ack=70000+54-54(全是头长,没数据项)。   
  26:一样的啊   



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/98933/showart_1965413.html

分享到:
评论

相关推荐

    TCP/IP协议三次握手

    三次握手,TCP/IP协议三次握手,TCP/IP协议三次握手

    tcp/ip,三次握手四次死挥手

    TCP/IP 协议群,三次握手四次死挥手 TCP/IP 协议群是计算机网络中最重要的基础协议之一,它是指一组使用 IP 进行通信时所必须用到的协议的统称。TCP/IP 协议群包括 IP、ICMP、TCP、UDP、TELNET、FTP、HTTP 等协议,...

    tcp/ip详解第三卷

    TCP是一种面向连接的、可靠的传输协议,通过三次握手建立连接,通过滑动窗口机制实现流量控制和拥塞控制,确保数据的正确无误传输。书中详细阐述了TCP的各种算法,包括慢启动、快速重传和快速恢复等,这些都是TCP...

    TCP/IP的三次握手建立连接(带图释)

    在TCP/IP的连接建立过程中,三次握手是至关重要的步骤。这一过程确保了双方都能正确接收和理解彼此的连接请求,从而建立起可靠的通信链路。下面详细解析三次握手的过程: 1. **第一次握手**:客户端(如图中的...

    TCP/IP协议详解全三卷 下载

    书中深入探讨了这些协议的工作原理,如IP地址的分配、分片与重组、TCP的三次握手和四次挥手、拥塞控制等机制。 第二卷《TCP/IP实现》则侧重于实际的实现细节,比如TCP的连接管理、滑动窗口机制、超时与重传策略,...

    TCP IP 详解三宗卷,tcp,ip详解(三卷全)pdf,C,C++

    卷3《TCP/IP详解:TCP事务协议》聚焦于TCP的事务处理,如TCP的三次握手和四次挥手过程,这是建立和断开TCP连接的关键步骤。同时,这本书也探讨了TCP的性能优化和异常情况处理,以及TCP与其他应用层协议的交互。 ...

    TCP/IP源码 完整的TCP/IP代码程序

    在源码中,你会看到TCP连接的建立(三次握手)、数据传输、以及断开连接(四次挥手)的过程。此外,TCP还采用了滑动窗口机制来控制流量和实现拥塞避免。 2. **IP(网际协议)**:IP负责将数据包发送到目标地址,它...

    TCP/IP 卷一 TCP/IP 详解

    - TCP协议的工作机制,如三次握手、四次挥手、滑动窗口、拥塞控制等。 - UDP协议的特点和应用场景。 - 面向连接的服务与无连接服务的区别。 - 端口和套接字的概念,以及它们在通信过程中的作用。 - ARP(地址解析...

    tcp/ip教程 tcp/ip教程

    1. **建立连接**:TCP使用三次握手建立连接,确保双方都有能力并愿意进行通信。 2. **数据传输**:TCP通过滑动窗口机制来控制数据传输速率,避免拥塞,并确保数据的可靠传输。 3. **确认与重传**:TCP使用ACK(确认...

    浅析TCP/IP三次握手机制的安全性.pdf

    讲解TCPip三次握手机制,是如何保证安全性和准确性的

    tcp/ip详解,卷2:实现源码

    1. **TCP连接管理**:包括三次握手建立连接和四次挥手断开连接的过程。源码中会展示如何处理SYN、ACK、FIN等不同类型的报文段,以及超时重传和半关闭状态的处理。 2. **滑动窗口机制**:TCP使用滑动窗口来控制流量...

    TCP/IP高清资料详解

    在这一卷中,读者可以了解到IP地址的结构、子网掩码的运用、ICMP(Internet Control Message Protocol)的工作原理,以及TCP的三次握手和四次挥手过程。此外,还会探讨端口的概念,以及TCP如何保证数据的可靠传输。 ...

    TCP-IP详解卷一:协议_TCP-IP详解_TCP/IP_tcp/ip详解_

    TCP通过三次握手建立连接,确保双方都有发送和接收能力。在数据传输过程中,TCP使用滑动窗口机制进行流量控制,防止拥塞,并通过确认和重传机制保证数据的可靠性。 IP(Internet Protocol)则是网络层的主要协议,...

    TCP/IP协议分析与应用学习资料

    TCP通过三次握手建立连接,并在数据传输结束后四次挥手断开连接。 IP(Internet Protocol)是网络层的主要协议,负责数据包在网络中的路由。它不保证数据包的顺序或可靠性,但提供了基本的寻址机制,使得数据包能够...

    追踪linux TCP/IP 代码运行_光盘文件1

    等源文件中,其关键功能包括三次握手建立连接、数据段的发送与接收、滑动窗口机制、重传策略等。 3. **IP协议**:IP协议位于网络层,负责将数据包发送到目标主机。Linux内核中的IP协议处理主要在`net/ipv4/ip.c`...

    TCP/IP协议族(第四版)习题答案

    习题可能涉及到TCP的三次握手、四次挥手、拥塞控制、滑动窗口机制以及UDP的特点与应用场景。 应用层是最接近用户的层次,包含了众多的应用协议,如HTTP、FTP、SMTP、DNS等。HTTP用于网页浏览,FTP用于文件传输,...

    TCP/IP实验报告及总结

    2. **TCP协议**:TCP是一种面向连接的、可靠的传输协议,它通过三次握手建立连接,并使用序列号和确认应答来确保数据的正确传输。TCP还具备流量控制和拥塞控制机制,以防止网络拥塞。 3. **IP协议**:IP协议处理...

    TCP/IP调试助手2.zip

    4. **连接测试**:可以进行TCP连接测试,检查两台设备间的连接是否畅通,包括三次握手和四次挥手过程。 5. **协议解析**:将接收到的数据包按照TCP/IP协议结构进行解析,展示每个字段的详细信息,有助于理解协议...

    http.rar_http socket_tcp/ip http_握手机制

    其中,TCP的三次握手是建立连接的关键步骤。三次握手包括以下阶段: 1. 第一次握手:客户端发送一个带有SYN(同步序列编号)标志的TCP报文到服务器,请求建立连接。 2. 第二次握手:服务器收到SYN报文后,会以自己...

    TCP/IP实例精心制作

    它确保数据能够按照发送顺序正确无误地到达接收方,通过使用三次握手建立连接,四次挥手断开连接。在TCP中,如果数据包在网络中丢失或损坏,TCP会自动重发这些包,从而保证数据的完整性。 IP(互联网协议)则是负责...

Global site tag (gtag.js) - Google Analytics