TCP/IP协议栈

Transmission Control Protocol/Internet Protocol传输控制协议/因特网互联协议

  • TCP/IP是一个Protocol Stack,包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP等许多协议
  • 最早发源于1969年美国国防部(缩写为DoD)的因特网的前身ARPA网项目,1983年1月1日,TCP/IP取代了旧的网络控制协议NCP,成为今天的互联网和局域网的基石和标准,由互联网工程任务组负责维护
  • 共定义了四层
  • 和OSI参考模型的分层有对应关系
    • 应用层对应OSI参考模型的应用层、表示层、会话层
    • 传输层对应OSI参考模型的传输层
    • 网络层对应参考模型的网络层
    • 网络访问层对应OSI参考模型的数据链路层和物理层(也有将网络访问层分为数据链路层和物理层的)

TCP特性

  • 工作在传输层
  • 面向连接协议
  • 全双工协议
  • 半关闭
  • 错误检查
  • 将数据打包成段,排序
  • 确认机制
  • 数据恢复,重传
  • 流量控制,滑动窗口
  • 拥塞控制,慢启动和拥塞避免算法
  • 更多关于tcp的内核参数,可参看man 7 tcp

TCP包头

  • 源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个
  • 序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从 0 开始
  • 确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送方:我希望你(指发送方)下次发送的数据的第一个字节数据的编号为此确认号
  • 数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节
  • URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效
  • ACK:表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段
  • PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中
  • RST:如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段
  • SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段
  • FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段
  • 窗口大小:表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量,达到此值,需要ACK确认后才能再继续传送后面数据,由Window size value * Window size scaling factor(此值在三次握手阶段TCP选项Window scale协商得到)得出此值
  • 校验和:提供额外的可靠性
  • 紧急指针:标记紧急数据在数据字段中的位置
  • 选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节
    • 常见选项:

      • 最大报文段长度:Maxium Segment Size,MSS,通常1460字节
      • 窗口扩大:Window Scale
      • 时间戳: Timestamps

TCP包头选项

  1. 最大报文段长度MSS(Maximum Segment Size):

    • 指明自己期望对方发送TCP报文段时那个数据字段的长度。比如:1460字节。数据字段的长度加上TCP首部的长度才等于整个TCP报文段的长度。MSS不宜设的太大也不宜设的太小。若选择太小,极端情况下,TCP报文段只含有1字节数据,在IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首部)。这样,网络的利用率就不会超过1/41。若TCP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成原来的TCP报文段。当传输出错时还要进行重传,这些也都会使开销增大。因此MSS应尽可能大,只要在IP层传输时不需要再分片就行。在连接建立过程中,双方都把自己能够支持的MSS写入这一字段。 MSS只出现在SYN报文中。即:MSS出现在SYN=1的报文段中
    • MTU和MSS值的关系:MTU=MSS+IP Header+TCP Header
    • 通信双方最终的MSS值=较小MTU-IP Header-TCP Header
  2. 窗口扩大:
    为了扩大窗口,由于TCP首部的窗口大小字段长度是16位,所以其表示的最大数是65535。但是随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口来满足性能和吞吐率,所以产生了这个窗口扩大选项
  3. 时间戳:
    可以用来计算RTT(往返时间),发送方发送TCP报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中,当发送方收到确认报文后即可计算出RTT。也可以用来防止回绕序号PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用32为表示,每2^32个序列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文

TCP协议PORT端口

传输层通过port号,确定应用层协议
Port number:

  • tcp:传输控制协议,面向连接的协议;通信前需要建立虚拟链路;结束后拆除链路

    • 0-65535
  • udp:User Datagram Protocol,无连接的协议
    • 0-65535
  • IANA:互联网数字分配机构(负责域名,数字资源,协议分配)
    • 0-1023:系统端口或特权端口(仅管理员可用) ,众所周知,永久的分配给固定的系统应用使用,22/tcp(ssh), 80/tcp(http), 443/tcp(https)
    • 1024-49151:用户端口或注册端口,但要求并不严格,分配给程序注册为某应用使用,1433/tcp(SqlServer), 1521/tcp(oracle),3306/tcp(mysql),11211/tcp/udp (memcached)
    • 49152-65535:动态端口或私有端口,客户端程序随机使用的端口
      其范围的定义:/proc/sys/net/ipv4/ip_local_port_range

TCP序列和确认号

发送数据包时,会在数据包头中写入序号n,对方收到回应n+1确认号,表示收到n号数据包,请发送n+1号数据包,而一般接收端不会每隔一个包就确认一次,而是每几个包确认一次,这就是窗口的大小,窗口有固定窗口和滑动窗口的分别,滑动窗口通过确认号来协商发送包的个数

TCP三次握手

建立连接的时候一定是客户端先向服务器发送请求建立连接

三次握手建立连接的过程:

  1. 客户端发送一个数据包,将SYN标记为设置为1,并将序号设置为相应的值(假设为n)
  2. 服务端收到SYN的数据包时,作为响应在回复的数据包中将SYN设置为1,将ACK设置为1,并将序号设置为相应的值(假设为m),确认号设置为n+1(表示确认收到n号数据包,请求发送n+1号数据包)
  3. 客服端收到服务端回复的响应包时,要向服务端发送一个确认收到信息的确认包,会将ACK标记位设置为1,将序号设置为n+1,将确认号设置为m+1表示收到m号数据包,请求发送m+1号数据包
  • 至此可靠的连接建立

举个例子:
A,B两支军队在两地共同攻击一个目标,要保证同时进攻,需要发送信息

  1. A向B发送上午8点整准时发动进攻,收到请确认回复
  2. B收到消息,回复:“收到作战信息,已部署上午8点准时发送进攻的作战计划,收到请回复”
  3. A收到B确认的信息,向B发送收到
  • 在这个例子中,必须要3次才能保证信息到达,并且保证双方同时在上午8点发动进攻,假设去掉第3次,B就不知道A知不知道B收到这个消息了,这样的话,如果B在2的回复因为某些原因被切断,A没有收到B的确认信息,B还会发动进攻,而A就没有发动进攻了,所以三次握手时很必要
  • 为什么A不需要收到B的确认信息呢?因为既然B已经回复了,就证明B一定收到了A发出的信息,所以在服务端回复的数据包中会有ACK标记

状态变化:

  • A(客户端):

    1. 客户端发送一个请求连接数据包后,从CLOSED切换到SYN-SENT(同步已发送)的状态
    2. 收到确认数据包后,从SYN-SENT切换到ESTAB-LISHED已建立连接状态
  • B(服务端):
    1. 收到请求连接的数据包后,从LISTEN切换到SYN-SENT状态
    2. 收到客户端的确认数据包后,从SYN-SENT切换到ESTAB-LISHED建立连接状态状态

TCP四次挥手

断开连接的时候不一定是谁先发出的断开请求

四次挥手的过程:

  1. A向B发送一个数据包,将FIN标记位设置为1,并将序号设置为相应的值(假设为n)
  2. B收到A的数据包时,返回一个数据包,将ACK的值设置为1,并将序号设置为相应的值(假设为m),确认号设置为n+1
  • 这时处于半关闭状态,A已经没有数据发送的情况,如果B还有数据发送不会立即断开连接,只有当数据发送完成以后,在执行第三步
  1. B向A发送一个数据包,将FIN标记位设置为1,将序号设置为相应的值(假设为x)
  2. A收到B的数据包,返回一个数据包,将ACK的值设置为1,并将序号设置为相应的值(假设为y),确认号设置为x+1
  • 在B收到A的确认包后立即关闭连接,而A在收到B的数据包时返回数据包,但并不会立即关闭连接,因为网络情况不稳定,可能还有数据包没有到达,所以还会再等待两个MSL时间才会关闭连接

状态变化:

  • A:

    1. 发送断开的数据包后就将状态从ESTAB-LISHED切换到了FIN-WAIT-1终止连接等待1的状态
    2. 收到B的确认包后就将FIN-WAIT-1切换到了FIN-WAIT-2终止等待2的状态
    3. 在收到B的终止连接的数据包并返回一个确认的数据包后,将FIN-WAIT-2切换为TIME-WAIT状态
    4. 再等待两个MSL时间之后,从TIME-WAIT切换到了CLOSE关闭状态
  • B:
    1. 在接收到A发送的断开连接数据包并返回确认数据包后,从ESTAB-LISHED状态切换到CLOSE-WAIT关闭等待状态
    2. 等待数据发送完成之后,就向A发送关闭连接数据包后,从CLOSE-WAIT关闭等待切换到LAST-ACK最后确认状态
    3. 在收到最后最后确认的数据包之后,从LAST-ACK切换到CLOSE状态

断开连接的时候,受访都可以先发起请求,例如B首相向A发送请求,一般都是不再发送数据的乙方向对方发送断开连接的请求,也可以同时断开,也不是必须四次挥手断开,仇视断开也可以

在有人恶意连接并使之处于半连接(只发送一个SYN包,等服务器发送SYN,ACK包之后,不回应ACK包)、半关闭状态时,会占满消息队列,并形程DDOS,所以在设置时需要设置一定的超时时间

11-2 TCP/IP协议栈的更多相关文章

  1. [转]为何TCP/IP协议栈设计成沙漏型的

    http://m.blog.csdn.net/blog/dog250/18959371 前几天有人回复我的一篇文章问,为何TCP/IP协议栈设计成沙漏型的.这个问题问得好!我先不谈为何它如此设计,我一 ...

  2. UNIX/Linux网络编程基础:图解TCP/IP协议栈

    目录 1.主机到网络层协议:以太网协议 2.IP协议 3.网际控制报文协议(ICMP) 4.传输控制协议(TCP) 5.用户数据报文协议(UDP) 6.流控制传输协议(SCTP) 7.地址解析协议(A ...

  3. 关于TCP/IP协议栈(转)

    1. TCP/IP协议栈 与OSI参考模型不同,TCP/IP协议栈共有4层,其中网络接口层对应OSI中的物理层和数据链路层,应用层对应OSI中的应用层.表示层和会话层. 在网络接口层的主要协议有:AR ...

  4. 关于TCP/IP协议栈

    1. TCP/IP协议栈 与OSI参考模型不同,TCP/IP协议栈共有4层,其中网络接口层对应OSI中的物理层和数据链路层,应用层对应OSI中的应用层.表示层和会话层. 在网络接口层的主要协议有:AR ...

  5. TCP/IP协议栈概述及各层包头分析

    TCP/IP协议栈中各层包头的分析 Protocol列表示的是该数据包最高层对应的协议,Length列表示该包的长度(包括从底层的协议到最高层的协议,其中包头一般是,链路层14字节,IP20字节,TC ...

  6. Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论

    我们使用Linux作为服务器操作系统时,为了达到高并发处理能力,充分利用机器性能,经常会进行一些内核参数的调整优化,但不合理的调整常常也会引起意想不到的其他问题,本文就一次Linux服务器丢包故障的处 ...

  7. TCP/IP 协议栈

    TCP(传输控制协议) 传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义. 在因特 ...

  8. 结合Wireshark捕获分组深入理解TCP/IP协议栈

    摘要:     本文剖析了浏览器输入URL到整个页面显示的整个过程,以百度首页为例,结合Wireshark俘获分组进行详细分析整个过程,从而更好地了解TCP/IP协议栈.   一.俘获分组 1.1 准 ...

  9. 计算机网络基础之TCP/IP 协议栈

    计算机网络基础之TCP/IP 协议栈 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.TCP/IP 协议栈概述 1>.什么是TCP/IP协议栈 Transmission C ...

  10. 12-1 TCP/IP协议栈

    TCP/IP协议栈 有限状态机FSM:Finite State Machine CLOSED 没有任何连接状态 LISTEN 侦听状态,等待来自远方TCP端口的连接请求 SYN-SENT 在发送连接请 ...

随机推荐

  1. windows下对socket的send和recv的超时设置,并附一个简洁明了的socket简单demo

    设置方法 int nNetTimeout=10000;//10秒,    //设置发送超时    setsockopt(m_socket,SOL_SOCKET,SO_SNDTIMEO,(char *) ...

  2. ArcGIS10.6 通过ArcMap发布二维数据服务。

    ArcGIS版本基本每年都会更新,原来一直用10.2,在ArcMap中发布服务: 最近安装10.6整套系统,发现在ArcMap中输入http:id:6080/arcgis  输入用户名,密码 无法登录 ...

  3. 【转】Golang关于channel传递引用引发的坑

    原文: https://studygolang.com/articles/12310/comment/17923 ------------------------------------------- ...

  4. 解决CentOS虚拟机开机黑屏卡死问题

    默认配置 导致的错误 1.直接就是黑屏,连杠杠都没有 2.centos系统关不掉 3.关闭vmware提示:虚拟机XXX繁忙 解决方式 一(我的失败,依旧不行)1.强制关闭vmware,重启计算机(不 ...

  5. 大数据之路week05--day01(JDBC 初识之实现一个系统 实现用户选择增删改查 未优化版本)

    要求,实现用户选择增删改查. 给出mysql文件,朋友们可以自己运行导入到自己的数据库中: /* Navicat MySQL Data Transfer Source Server : mysql S ...

  6. 使用selenium实现站长素材图片采集

    from selenium import webdriver import requests,os from lxml import etree from selenium.webdriver.chr ...

  7. SQL Server遇到的错误和有用的tools

    1.The target principal name is incorrect.  Cannot generate SSPI context. 检查IIS的profile,可能是密码错误 2.The ...

  8. moment.js 日期转换工具

    官方网站: http://momentjs.cn/ 文档: https://itbilu.com/nodejs/npm/4Jxk-Ti-l.html https://www.jianshu.com/p ...

  9. D. Restore Permutation(权值线段树)

    D. Restore Permutation time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  10. 微信小程序之简单记账本开发记录(四)

    昨天搭建了大致界面 今天需要将用到的一系列样式表配置出来并检查错误