TCP字节流服务

网络传输层中,TCP是面向连接、可靠的、字节流传输。

TCP协议通信双方必须先建立连接,通信双方必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。TCP是全双工的,即双方的数据读写可通过一个连接进行。完成数据交换之后,通信双方都必须断开连接以释放系统资源。

TCP协议的这种连接是一对一的,所以基于广播和多播(目标是多个主机地址)的应用程序不能使用TCP服务。而无连接的UDP则十分适合这种广播和多播。

TCP协议使用字节流(UDP使用数据报),实际编程中字节流和数据报的主要区别体现在通信双方是否必须执行相同次数的读、写操作(只是表现形式),发送端应用程序连续执行多次写操作时,TCP模块先将这些数据放入TCP发送缓冲区中。当TCP模块真正开始发送数据时,发送缓冲区中这些等待发送的数据可能被封装成一个或多个TCP报文段发出。因此,TCP模块发送出的TCP模块发送出的TCP报文段的个数和应用程序执行的写操作次数之间没有固定的数量关系。

当接收端收到一个或多个TCP报文段后,TCP模块将他们携带的应用程序数据按照TCP报文段的序号依次放入TCP接收缓冲区中,并通知应用程序读取数据。接收端应用程序可以一次性将TCP接收缓冲区中的数据全部都出,也可以分多次读取,这取决于用户制定的应用程序读缓冲区的大小。因此,应用程序执行的读操作次数和TCP模块接收到的TCP报文段个数之间也没有固定的数量关系。

综上所述,发送端执行的写操作次数和接收端执行的读操作次数之间没有任何数量关系,这就是字节流的概念:应用程序对数据的发送和接收是没有边界限制的。UDP则然,发送端应用程序没执行一次写操作,UDP模块就将其封装成一个UDP数据包并发送之。接收端必须及时针对每一个UDP数据报执行读操作(通过recvfrom系统调用),否则就会丢包(这经常发生在较慢的服务器上)。并且,如果过用户没有指定足够的应用程序缓冲区来读取UDP数据,则UDP数据将被截断。

以下就是TCP字节流服务和UDP数据报服务的具体框图:(TCP多对多,UDP一对一)

TCP头部结构

以下是TCP头部结构:

16位端口号:告知主机该报文段是来自哪里(源端口Source Port)以及传给哪个上层协议或应用程序(目的端口Destination Port)的。进行TCP通信时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号(比如DNS协议对应端口53,HTTP协议对应80,这些端口号可在/etc/services文件中找到)。

32位序号:一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。假设主机A和主机B进行TCP通信,A发送给B的第一个TCP报文段中,序号值被系统初始化为某个随机值ISN(Initial Sequence Number,初始序号值)。那么在该传输方向上(从A到B),后续的TCP报文段中序号值将被系统设置成ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如,某个TCP报文段传送的数据是字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025.另外一个传输方向(从B到A)的TCP报文段的序号值也具有相同的含义。

32位确认号(acknowledgement number):用作对另一方发送来的TCP报文段的响应。其值是收到的TCP报文段的序号值加1。假设主机A和主机B进行TCP通信,那么A发送出的TCP报文段不仅携带自己的序号,而且包含对B发送来的TCP报文段的确认号。反之,B发送出的TCP报文段也同时携带自己的序号和对A发送来的报文段的确认号。

 4位头部长度(header length):标识该TCP头部有多少个32bit字(4字节)。因为4位最大能标识15,所以TCP头部最长是60字节。

 6位标志位包含如下几项

URG标志,表示紧急指针(urgent pointer)是否有效。

ACK标志,表示确认号是否有效。我们称携带ACK标识的TCP报文段为确认报文段。

PSH标志,提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间(如果应用程序不将接收

到的数据读走,它们就会一直停留在TCP接收缓冲区中)。

RST标志,表示要求对方重新建立连接。我们称携带RST标志的TCP报文段为复位报文段。

SYN标志,表示请求建立一个连接。我们称携带SYN标志的TCP报文段为同步报文段。

FIN标志,表示通知对方本端要关闭连接了。我们称携带FIN标志的TCP报文段为结束报文段。

16位窗口大小(window size):是TCP流量控制的一个手段。这里说的窗口,指的是接收通告窗口(Receiver Window,RWND)。它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。

 16位校验和(TCP check sum):由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意,这个校验不仅包括TCP头部,也包括数据部分。这也是TCP可靠传输的一个重要保障。

16位紧急指针(urgent pointer):是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此,确切地说,这个字段是紧急指针相对当前序号的偏移,不妨称之为紧急偏移。TCP的紧急指针是发送端向接收端发送紧急数据的方法。

TCP头部选项:TCP头部的最后一个选项字段(options)是可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。典型的TCP头部选项结构如下图所示。

选项的第一个字段kind说明选项的类型。有的TCP选项没有后面两个字段,仅包含1字节的kind字段。第二个字段length(如果有的的话)指定该选项的总长度,该长度包括kind字段和length字段占据的2字节。第三个字段info(如果有的话)是选项的具体信息。常见的TCP选项有7中,如下图

kind=0是选项表结束选项。

kind=1是空操作(nop)选项,没有特殊含义,一般用于将TCP选项的总长度填充为4字节的整数倍。

kind=2是最大报文段长度选项。TCP连接初始化时,通信双方使用该选项来协商最大报文段长度(Max Segement Size,MSS)。TCP模块通常将MSS设置为(MTU-40)字节(减掉的这40字节包括20字节的TCP头部和20字节的IP头部)。这样携带TCP报文段的IP数据报的长度就不会超过MTU(假设TCP头部和IP头部都不包含选项字段,并且这也是一般情况),从而避免本机发生IP分片。对以太网而言,MSS值是1460(1500-40)字节。

kind=3是窗口扩大因子选项。TCP连接初始化时,通信双方使用该选项来协商接收通告窗口的扩大因子。在TCP的头部中,接收通告窗口大小时用16位表示的,故最大为65535字节,但实际上TCP模块允许的接收通告窗口大小远不止这个数(为了提高TCP通信的吞吐量)。窗口扩大因子解决了这个问题。假设TCP头部中的接收通告窗口大小是N乘2的M次方,或者说N左移M位。注意,M的取值范围是0~14。我们可以通过修改/proc/sys/net/ipv4/tcp_window_scaling内核变量来启用或关闭窗口扩大因子选项。

kind=5是SACK实际工作的选项。该选项的参数告诉发送方本端已经收到并缓存的不连续的数据块,从而让发送端可以据此检查并重发丢失的数据块。每个块边沿(edge of block)参数包含一个4字节的序号。其中块左边沿表示不连续块的第一个数据的序号,而块右边沿则表示不连续块的最后一个数据的序号的下一个序号。这样一对参数(块左边沿和块右边沿)之间的数据是没有收到的。因为一个块信息占用8字节,所以TCP头部选项中实际上最多可以包含4个这样的不连续数据块(考虑选项类型和长度占用的2字节)。

kind=8是时间戳选项。该选项提供了较为准确的计算通信双方之间的回路时间(Round Trip Time,RTT)的方法,从而为TCP流量控制提供重要信息。我们可以通过修改/proc/sys/net/ipv4/tcp_timestamps内核变量来启用或关闭时间戳选项。

以下是抓到的一个TCP报文段:

从图中可以看出源端口号58991对应e66f,目的端口号443,对应01bb,Flags为SYN,表示请求一个连接,因此它是一个同步报文段。这里seq表示的是相对序号,因为该同步报文段是从180.85.25.164到74.125.204.100的第一个TCP报文段,所以该序号值也就是此次通信过程中该传输方向的ISN值,则相对序号即为0。并且,因为这是通信过程中第一个TCP报文段,所以它没有针对对方发送来的TCP报文段的确认值(尚未收到任何对方发来的TCP报文段)。

window size是接收通告窗口大小,因为这是一个同步报文段,所以win值反映的是实际的接收通告窗口大小。

TCP协议详解(一):TCP头部结构相关推荐

  1. TCP协议详解之TCP Flag标志位来判断TCP会话的开始和结束

    首先回顾一下TCP标志位的具体含义. TCP Flag标志位(控制位) 一个TCP包的详细内容: TCP FLAG 标记占1.5个byte,12bit(4bit+8bit,前半个byte与Header ...

  2. IP协议详解之IPv6头部结构简介

      IPv6协议是网络层技术发展的必然趋势,因为它不仅解决了IPv4地址不够用的情况,还做了很大的改进,比如,增加了多播和流的功能,为网络上多媒体内容的质量提供精细的控制,引入自动配置功能,使得局域网 ...

  3. IP协议和TCP协议详解

    IP协议和TCP协议详解 IP协议 IP协议的特点 IPV4头部信息 IP分片 重定向 IPV6头部结构 TCP协议 TCP协议的特点 TCP头部结构 TCP连接的建立与关闭 异常终止连接 异常终止连 ...

  4. Linux网络-UDP/TCP协议详解

    Linux网络-UDP/TCP协议详解 零.前言 一.UDP协议 二.TCP协议 1.应答机制 2.序号机制 3.超时重传机制 4.连接管理机制 三次握手 四次挥手 5.理解CLOSE_WAIT状态 ...

  5. 【工控老马】西门子PLC Siemens PLC TCP协议详解

    Siemens PLC TCP 协议详解 说明:蓝色文字表示已经破解部分,[红色文字] 表示对破解部分数字的说明,黑色文字表示对破解部分的进一步说明,黑色斜体加粗文字表示未破解部分,高亮文字部分表示驱 ...

  6. IP/TCP协议详解

    系列文章目录 第一篇 : TCP/IP协议详解 第二篇 : IP协议 第三篇 : TCP协议 第四篇 : 面试准备 文章目录 系列文章目录 前言 第一章.TCP/协议族 1.1 层次介绍 1.2 封装 ...

  7. TCP/IP协议详解、TCP三次握手

    TCP/IP协议详解:TCP/IP协议详解_王佳斌-CSDN博客_tcp/ip协议认识HTTP协议它是互联网协议(Internet Protocol Suite),一个网络通信模型,是互联网的一个基本 ...

  8. 【TCP/IP】TCP协议详解

    TCP是如何确保可靠传输的? 为了保证可靠传输,TCP比UDP多了很多控制协议和算法: 连接管理--3次握手和4次握手: 数据破坏--通过校验和: 丢包--应答与超时重发机制: 分片乱序--序列号: ...

  9. 传输层协议之TCP协议详解

    传输层重点协议:UDP和TCP. 作用:负责数据能够从发送端传输到接收端.(在进行网络编程时,我们会使用到socket,然而一旦调用socket就进入到了传输层的范畴内) 前面我们已经讲过UDP协议了 ...

  10. TCP协议详解---上

    TCP头格式 注意以下几点: TCP的包是没有IP地址的,那是IP层上的事.但是有源端口和目标端口. 一个TCP连接需要四个元组来表示是同一个连接(src_ip, src_port, dst_ip, ...

最新文章

  1. c 复杂的前置后置面试题_采摘后18小时直达货架,利农集团用后置仓“直连”生鲜电商...
  2. Salesforce 小知识:大量“子记录”的处理方法
  3. DELL服务器iDRAC相关设置
  4. 【转】使用websocket-sharp来创建c#版本的websocket服务
  5. 使用XStream对Java对象进行序列化和反序列化
  6. 【李宏毅机器学习】Recurrent Neural Network Part1 循环神经网络(p20) 学习笔记
  7. 「技术大牛」是如何缩短事件平均解决时间的?
  8. 2.学习管理系统项目学习一
  9. 某项目的双代号网络图如下所示_系统集成项目管理工程师5天备考第3天第1-2学时...
  10. gbase 连接数据库
  11. webstorm破解方法
  12. 调试技巧之调用堆栈 - Call stack
  13. Python语音基础操作--5.4小波分解
  14. Android兼容性测试应该怎么做逼格更高呢?
  15. CentOs7下Zabbix安装教程——zabbix server安装
  16. 混合动力系统的整车经济性开发与能量管理策略高级技术
  17. html叫编程语言吗,html是编程语言吗
  18. 2022年底了,你们公司还好吗?我这里不太好
  19. SSD固态硬盘和HDD机械硬盘的区别
  20. 水面倒影风格的LOGO在线做

热门文章

  1. 学习笔记(05):Python数据殿堂:数据分析与数据可视化-花哨的索引,数组的排序,结构化数组...
  2. mt管理器修改迷你世界服务器,用支付宝支付的游戏,怎么改代码,游戏迷你世界...
  3. python输入名字输出姓_python学习-输入输出
  4. 全文检索es与Solr
  5. 网易教程python_Python抓取网易云专辑图详细教程
  6. 浅谈OpenStack社区COA认证考试
  7. Navicat for Mysql 乱码问题解决
  8. 【附源码】计算机毕业设计JAVA校园摄影爱好者交流网站
  9. win10 硬盘100% 解决
  10. 2021-06-25kali更新火狐教程转