计算机网络-传输层篇-TCP协议

  • TCP(Transmission Control Protocol:传输控制协议)
  • 传输层协议主要有两个:
  • TCP协议和UDP协议
  • TCP协议特点:

  • 面向连接(通信前需要先三次握手建立连接,通信后四次挥手释放连接)
  • 字节流
  • 字节流服务和数据报服务两者的区别对应在实际编程中
  • 则体现为通信双方是否必须执行相同次数的读写操作
  • 当发送端应用程序连续执行多次写操作时
  • TCP模块先将这些数据放入TCP发送缓冲区中
  • 当TCP模块真正发送数据时
  • 发送缓冲区中等待发送的数据就可能被封装成一个或者多个TCP报文段发出
  • 因此,TCP模块发送出的TCP报文段的个数和应用程序执行的写操作次数之间没有固定的数量关系
  • 当接收端收到一个或者多个TCP报文段后
  • TCP模块将他们携带的应用程序数据按照TCP报文段的序号依次放入TCP接收缓冲区中,并通知应用程序读取数据
  • 接收端应用程序可以一次性将TCP接收缓冲区的数据全部读出,也可以分多次读取,这取决于用户指定的应用程序读缓冲区的大小
  • 因此,应用程序执行的读操作次数和TCP模块接收到的TCP报文段个数之间也没有固定的数量关系
  • UDP数据报服务则不然
  • 发送端应用程序每执行一次写操作,UDP模块就将其封装成一个UDP数据报并发送出去
  • 接收端必须及时针对每一个UDP数据报执行读操作,否则就会丢包
  • 并且,如果用户没有指定足够的应用程序缓冲区来读取UDP数据,则UDP数据将被截断
  • 可靠传输(确保数据不会丢失)
  • 首先,TCP协议采用发送应答机制,即发送端发送的每个TCP报文段都必须得到接收方的应答,才认为这个TCP报文段传输成功
  • 其次,TCP协议采用超时重传机制,发送端在发送出一个TCP报文段之后启动定时器,如果在定时时间内未收到应答,它将重发该报文段
  • 最后,因为TCP报文段最终是以IP数据报发送的,而IP数据报到达接收端可能乱序、重复,所以TCP协议还会对接收到的TCP报文段重排、整理,再交付给应用层
  • UDP协议则和IP协议一样,提供不可靠服务
  • 它们都需要上层协议来处理数据确认和超时重传
  • 在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销(拥塞控制)
  • 通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点
  • 因为有着拥塞控制和可靠数据传输的要求所以导致了TCP协议的传输效率相对于UDP要低,但是不会像UDP一样出现丢包现象
  • 使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写
  • 双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输
  • TCP连接是全双工的,即双方的数据读写可以通过一个连接进行
  • 完成数据交换之后,通信双方都必须断开连接以释放系统资源
  • TCP首部格式

  • 16位端口号(port number):
  • 告知主机该报文段是来自哪里(源端口)以及传给哪个上层协议或应用程序(目的端口)的
  • 进行TCP通信时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号;
  • 所有知名服务使用的端口号都定义在/etc/services文件中
  • 32位序号( sequence number):
  • 一次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 checksum):
  • 由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏
  • 注意,这个校验不仅包括TCP头部,也包括数据部分
  • 这也是TCP可靠传输的一个重要保障
  • 16位紧急指针(urgent pointer):
  • 是一个正的偏移量
  • 它和序号字段的值相加表示最后一个紧急数据的下一字节的序号
  • 因此,确切地说,这个字段是紧急指针相对当前序号的偏移,不妨称之为紧急偏移
  • TCP 的紧急指针是发送端向接收端发送紧急数据的方法

你可能感兴趣的:(计算机网络,tcp/ip,网络,计算机网络)