zoukankan      html  css  js  c++  java
  • TCP/IP详解

    TCP/IP 

    2012-07-19 22:13:40|  分类: 网络基础知识 |  标签:网络基础  |字号订阅

     
     

     

     

        

    端口的概念:1-1023是系统分配的端口,应用程序不可用。常见的端口有

    • 20:FTP数据连接
    • 21:FTP控制连接
    • 23:Telnet
    • 25:SMTP
    • 80:HTTP

    TCP连接三次握手:

    第一次握手:客户端TCP首先给服务器端TCP发送一个特殊的TCP数据

    段。该数据段不包含应用层数据,并将头部中的SYN位设置为1,所以该数

    据段被称为SYN数据段。另外,客户选择一个初始序列号SEQ,设SEQ=x

    并将这个编号放到初始的TCP SYN数据段的序列号字段中。该数据段被封

    装到一个IP数据报中,并发送给服务器。

    第二次握手:一旦装有TCP SYN数据段的IP数据报到达了服务器主机,服

    务器将从该数据报中提取出TCP SYN数据段,给该连接分配TCP缓冲区和

    变量,并给客户TCP发送一个允许连接的数据段。这个允许连接的数据段

    也不包含任何应用层数据。但是,它的头部中装载着3个重要信息。首先,

    SYN被设置为1;其次,TCP数据段头部的确认字段被设置为x+1;最后,

    服务器选择自己的初始顺序号,SEQ=y,并将该值放到TCP数据段头部的

    序列号字段中。

    第三次握手:在接收到允许连接数据段之后,客户也会给连接分配缓冲区

    和变量。客户端主机还会给服务器发送另一个数据段,对服务器的允许连

    接数据段给出确认。

     

     

    整个过程如图所示:

     

    概念:

    未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于 Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。

    Backlog参数:表示未连接队列的最大容纳数目。SYN-ACK重传次数服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。

    半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。

     

     

     

     

     

     

     

     

     

    TCP释放连接

    第一次挥手:由进行数据通信的任意一方提出要求释放连接的请求报文段。

    第二次挥手:接收端收到此请求后,会发送确认报文段,同时当接收端的所有数据也都已经发送完毕后,接收端会向发送端发送一个带有其自己序号的报文段。

    第三次挥手:发送端收到接收端的要求释放连接的报文段后,发送反向确认。

        TCP数据报文格式:

    • 源端口和目的端口字段——各占 2 字节。标识了发送方和接收方的应用进程。
    • 序号字段——占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
    • 确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
    • 数据偏移——占 4 bit,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。
    • 保留字段——占 6 bit,保留为今后使用,但目前应置为 0。
    • 紧急比特 URG —— 当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
    • 确认比特 ACK —— 只有当 ACK = 1 时确认号字段才有效。当 ACK = 0 时,确认号无效。
    • 推送比特 PSH (PuSH) —— 接收 TCP 收到推送比特置 1 的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。
    • 复位比特 RST (ReSeT) —— 当 RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,通知一下对方。
    • 同步比特 SYN —— 同步比特 SYN 置为 1,就表示这是一个连接请求或连接接受报文。
    • 终止比特 FIN (FINal) —— 用来释放一个连接。当FIN = 1 时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
    • 窗口字段 —— 占 2 字节。窗口字段用来控制对方发送的数据量,单位为字节。TCP 连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。
    • 检验和 —— 占 2 字节。检验和字段检验的范围包括首部和数据和伪段头(不是TCP里的信息,但是计算校验和的时候也计算了的内容:IP地址,TCP数据段长度,协议类型)。
    • 紧急指针字段 —— 占 16 bit。紧急指针指出在本报文段中的紧急数据的位置。
    • 选项字段 —— 长度可变。TCP 规定了二种选项,最大报文段长度 MSS (Maximum Segment Size)。MSS 告诉对方 TCP:"我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。" 和窗口扩大因子,用于扩大接收方窗口。MSS 是 TCP 报文段中的数据字段的最大长度。数据字段加上 TCP 首部才等于整个的 TCP 报文段。
    • 填充字段 —— 这是为了使整个首部长度是 4 字节的整数倍。
  • 相关阅读:
    程序员:不要自称为码农
    SpringBoot对静态资源配置
    LeetCode 572. Subtree of Another Tree(子树)
    LeetCode 437. Path Sum III(统计路径和等于sum的路径数量)
    LeetCode 112. Path Sum(判断路径和是否等于一个数)
    LeetCode 617. Merge Two Binary Trees(归并两棵二叉树)
    LeetCode 226. Invert Binary Tree(翻转二叉树)
    Failure to transfer org.apache.maven.plugins:maven-resources-plugin:pom:2.6 的解决办法
    linux-查询某软件的安装的目录
    WebService概念解释
  • 原文地址:https://www.cnblogs.com/siguoya/p/3512021.html
Copyright © 2011-2022 走看看