TCP基础知识总结

1. TCP服务简介

TCP与UDP一样,都是传输层的协议,但是提供的服务却大不相同,UDP为上层应用提供的是一种不可靠、无连接的服务,而TCP则提供一种面向连接、可靠的字节流传输服务,TCP让两个主机建立连接的关系,应用数据以数据流的形式进行传输。
TCP先后发出的数据在网络中虽然也是互不相干的传输,但是这些数据本身携带的信息却是紧密联系的,TCP协议会给每个传输的字节进行编号,当然,两个主机方向上的数据编号是独立的,在传输的过程中,发送方把数据的起始编号与长度放在TCP报文中,在接收方将所有数据按照编号组装起来,然后返回一个确认,当所有数据接收完成之后才将数据递交到应用层中。

2. TCP的特性

2.1 连接机制

TCP是一个面向连接的协议,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一个连接,否则将无法发送数据,一个TCP连接必须有双方IP地址端口号

2.2 确认与重传

一个完整的TCP传输必须有数据的交互,接收方在接收到数据之后必须进行正面确认,向发送方报告接收的结果。
而发送方在发送数据之后必须等待接收方的确认,同时发送的时候会启动一个定时器,在指定超时时间内没有收到确认,发送方会认为发送失败。然后进行重发操作,这就是重传报文。
TCP提供可靠的传输层,但它依赖的是IP层的服务,IP数据报的传输是无连接、不可靠的,因此它要通过确认来知道接收方确实已经收到数据了。但数据和确认都有可能会丢失,因此TCP通过在发送时设置一个超时机制(定时器)来解决这种问题,如果当超时时间到达的时候还没有收到对方的确认,它就重传该数据。

2.3 缓冲机制

在发送方想要发送数据的时候,由于应用程序的数据大小、类型都是不可预估的,而TCP协议提供了缓冲机制来处理这些数据。如在数据量很小的时候,TCP会将数据存储在一个缓冲空间中,等到数据量足够大的时候再进行发送数据,这样能提高传输的效率并且减少网络中的通信量。在数据发送出去的时候并不会立即删除数据,还是让数据保存在缓冲区中,因为发送出去的数据不一定能被接收方正确接收,它需要等待到接收方的确认再将数据删除。同样的,在接收方也需要有同样的缓冲机制,因为在网络中传输的数据报到达的时间是不一样的,而且TCP协议还需要把这些数据报组装成完整的数据,然后再递交到应用层中。

2.4 全双工通信

TCP协议是一个全双工的协议,在TCP连接建立后,那么两个主机就是对等的,任何一个主机都可以向另一个主机发送数据,数据是双向流通的。
一般来说,TCP协议的确认是通过捎带方式来实现的,即接收方把确认信息放到反向传来的数据报文中,不必单独为确认信息申请一个报文,捎带机制减少了网络中的通信流量。

2.5 流量控制

TCP提供了流量控制服务(flow-control service)以消除发送方使接收方缓冲区溢出的可能性。流量控制是一个速度匹配服务,即发送方的发送速率与接收方应用程序的读取速率相匹配。TCP协议中使用滑动窗口的流量控制方法。
TCP通过让发送方维护一个称为接收窗口的变量来提供流量控制,它用于给发送方一个提示:接收方还能接收多少数据,接收方会将此窗口值放在TCP报文的首部中的窗口字段,然后传递给发送方,这个窗口的大小是在发送数据的时候动态调整的。

2.6 差错控制

除了确认与重传之外,TCP协议也会采用校验和的方式来检验数据的有效性,主机在接收数据的时候,会将重复的报文丢弃,将乱序的报文重组,发现某段报文丢失了会请求发送方进行重发,因此在TCP往上层递交的数据是顺序的、无差错的完整数据。

2.7 拥塞控制

如果一个主机以很大的流量给另一个主机发送数据,但是其中间的路由器通道很小,无法承受这样大的数据流量的时候,就会导致拥塞的发生,这样就导致了接收方无法在超时时间内完成接收(接收方此时完全有能力处理大量数据),而发送方又进行重传,这样就导致了链路上更加拥塞。
因此发送方必须实现一定的自适应机制,在网络中拥塞的情况下调整自身的发送速度,这种形式对发送方的控制被称为拥塞控制

3. 端口号的概念

TCP协议的连接是包括上层应用间的连接,简单来说,TCP连接是两个不同主机的应用连接,而传输层与上层协议是通过端口号进行识别的,端口号的取值范围是0~65535,这些端口标识着上层应用的不同线程。一个主机内可能只有一个IP地址,但可能有多个端口号,每个端口号表示不同的应用线程。
TCP协议常用的端口号如下表所示:

端口号协议说明
20/21FTP文件传输协议
23Telnet终端远程登录
25SMTP简单邮件传输协议
69TFTP普通文件传输协议
80HTTP超文本传输协议
110POP3邮局协议版本3

4. TCP报文段结构

4.1 TCP报文段的封装

TCP报文段依赖IP协议进行发送,因此TCP报文段封装在IP数据报中,IP数据报封装在以太网帧中,TCP报文段经过了两次的封装,然后发送出去,具体见下图:

TCP报文段的封装

4.2 TCP报文段格式

TCP报文段如ARP报文、IP数据报一样,也是由首部+数据区域组成,TCP首部内容很丰富,如果不计算选项字段,一般来说TCP首部有20字节,如下图所示:

TCP报文段格式
在LWIP协议栈中,TCP报文段首部采用一个名字叫tcp_hdr的结构体进行描述:

struct tcp_hdr {
  PACK_STRUCT_FIELD(u16_t src);
  PACK_STRUCT_FIELD(u16_t dest);
  PACK_STRUCT_FIELD(u32_t seqno);
  PACK_STRUCT_FIELD(u32_t ackno);
  PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags);
  PACK_STRUCT_FIELD(u16_t wnd);
  PACK_STRUCT_FIELD(u16_t chksum);
  PACK_STRUCT_FIELD(u16_t urgp);
} PACK_STRUCT_STRUCT;

1.源端口和目的端口:各占2个字节,端口是传输层和应用层的服务接口,传输层的复用和分用功能都要通过端口才能实现。
2.序号:占4个字节。TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,整个要传送的字节流的起始序号必须在连接建立时设置,首部中的序号字段值则是指本报文段所发送的数据的第一个字节的序号例如,一个报文段的序号是301,而数据共100字节,这就表明:本报文段的数据的第一个字节的序号是301,最后一个字节的序号是400。显然,下一个报文段(如果还有的话)的数据序号应当从401开始,即下一个报文段的序号字段值应为401。
3.确认号:占4个字节。是期望收到对方下一个报文段的第一个数据字节的序号。例如,B正确收到了A发送过来的一个报文段,其序号字段值是501,而数据长度是200字节(序号501~700),这表明B正确收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。
4.数据偏移(首部长度):占4位。它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。应注意,“数据偏移”以4字节为计算单位,由于4位二进制数表示的最大十进制数字是15,因此数据偏移的最大值是60字节,这也是TCP首部的最大字节(即选项长度不能超过40字节)。
5.保留:占6位。保留为今后使用,但目前应置为0。
6.紧急URG:占1位。当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快发送(相当于高优先级的数据),而不要按原来的排队顺序来传送。要与首部中紧急指针字段配合使用。
7.确认ACK:占1位。仅当ACK=1时确认号字段才有效。TCP协议规定,在建立连接后所有传送的报文段都必须把ACK置为1.
8.推送PSH:占1位。当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push)的操作。这时,发送方TCP把PSH置为1,并立即创建一个报文段发送出去,接收方TCP收到PSH=1的报文段,就尽快地交付接收应用进程,而不用再等到整个缓存都填满了后再向上交付。
9.复位RST:占1位。当RST=1时,表明TCP连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接。然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。
10.同步SYN:占1位。在建立连接时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1,因此SYN置为1就表示这是一个请求连接或连接接受报文。
11.终止FIN:占1位。用来释放连接。当FIN=1时,表明此报文段的数据已发送完毕,并要求释放连接。
12.窗口:占2个字节。窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。
13.检验和:占2个字节。检验和字段检验的范围包括首部和数据这两部分。
14.紧急指针:占2个字节。紧急指针在URG=1时才有意义,它指出本报文段中的紧急数据字节数(紧急数据结束后就是普通数据),当紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可以发送紧急数据。
15.选项:长度可变,最长可达40字节。
16.填充:为了使整个首部长度是4字节的整数倍。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值