TCP/IP系列——TCP连接(1)

本文档不对TCP做详细说明,这里只是为说明HTTP的性能做相应的TCP铺垫

一、TCP Format

Source Port & Destination Port
源端口号:用来指明发送应用进程;
目的端口号:用来指明接收方的应用进程。
Sequence Number
序列号。
该字节表示本报文段所发送的数据的第一个字节的序号。TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。例如,某一报文段的序列号Sequence Number=201,携带100字节的数据,则表明最后一个字节的序号为300,下一个报文段的序列号得从301开始。
这个序列号是一个32位的无符号数,到达2^32-1后再循环回0开始。
Acknowledgment Number
确认号。
该字节表示期望收到对方下一个报文段的第一个数据字节的序号。例如,B正确收到了A发过来的一个报文段,序列号为201,数据长度为200字节。则B回复A的确认号则为Acknowledgement Number=401。
确认号的范围是2^32-1,因此可以对4GB的数据进行编号,一般情况下,当序号需要重复使用时,旧序号的数据早已通过网络到达终点了。
ACK
确认 (ACKnowledgment)。
可携带数据。
仅当ACK=1时,确认号(Acknowledgement Number)才有效。TCP固定,在连接建立之后,所有传送的报文段的ACK都必须置为1。
SYN
同步(SYNchronization)。
(TCP的SYN段也能够承载应用数据。由于伯克利的套接字API不支持这种方式,因此它也很少为人所用。)->(源自TCP/IP卷1),待考证。
在连接时对序列号进行同步。当建立新连接时,SYN值被置为1。
当SYN=1,ACK=0,则表明这是一个连接请求报文段,因为连接建立之后的所有报文段的ACK都被置1。此时,若同意建立连接,则响应的报文段中使SYN=1,ACK=1。
SYN=1表示这是一个连接请求或连接接受报文。
FIN
终止。
用来释放连接。FIN=1表示此报文段的发送方的数据已经发送完毕,并要求释放传输连接。
Options
选项。
当没有选项时,TCP的首部长度为20字节。

二、Three way handshake

在这里插入图片描述
Figure 2 3 A normal TCP connection establishment
RFC 793:
在这里插入图片描述
《计算机网络(第7版)》
在这里插入图片描述
鉴于以上说明,所以这里不作中文翻译。
如Figure 2 3所示,连接建立的步骤如下(关于ISN参见ISN小节):
B的TCP服务器进程先创建传输控制块TCB,准备接收客户进程的连接请求。然后服务器进程就处于LISTEN状态,等待客户进程的连接;
1. 主动开启者(通常称为客户端):(1/3)
创建TCB,然后发送一个TCP连接请求报文段,报文段中主要包括如下字段:
目的端口号:指明通信的进程;
序列号Seq=ISN©;
SYN=1;
通常,客户端还会借此发送一个或多个Options。
TCP客户进程进入SYN-SENT(同步已发送)状态
2. 服务器端(2/3)
若同意连接,则回一个TCP报文段,报文段中主要包括如下字段:
SYN=1;
ACK=1;
序列号:Seq=ISN(s);
确认号:ack=ISN©+1;
TCP客户进程进入SYN-REVD(同步收到)状态
3. 客户进程A收到服务进程B的确认后,还要向B给出确认(3/3)
TCP报文段主要包括如下字段:
ACK=1;
序列号:Seq=ISN©+1
确认号:ack=ISN(s)+1;

为何客户进程A最后还要发送一次确认?
为了防止已失效的连接请求报文段突然又传送到B,因而产生错误。

ISN

ISN的值不是这个数字不是0和1,而是另一个数字,经常是随机选择的,称为初始序列号(Initial SequenceNumber, ISN)。ISN不是0和1,是因为这是一种安全措施。[RFC793]指出初始序列号可被视为一个32位的计数器。该计数器的数值每4微秒加10。此举的目的在于为一个连接的报文段安排序列号,以防止出现与其他连接的序列号重叠的情况。
当一个连接打开时,任何拥有合适的IP地址、端口号、符合逻辑的序列号(即在窗口中)以及正确校验和的报文段都将被对方接收。
如果连接由于某个报文段的长时间延迟而被关闭,然后又以相同的4元组被重新打开,那么可以相信延迟的报文段又会被视为有效数据重新进人新连接的数据流中。
解决方案:通过采取一些步骤来避免这种连接实例间的序列号重叠问题。现代系统通常采用半随机的方法选择初始序列号;Linux系统采用基于时钟的方案选择初始序列号,并且针对每一个连接为时钟设置随机的偏移量。随机偏移量是在连接标识(即4元组)的基础上利用加密散列函数得到的。散列函数的输人每隔5分钟就会改变一次。在32位的初始序列号中,最高的8位是一个保密的序列号,而剩余的备位则由散列函数生成。但是这也只能降低风险,一个对数据完整性有较高要求的应用程序也可以在应用层利用CRC或校验和保证所需数据在传输过程中没有出现任何错误,这种方式已普遍用于大文件的传输。
一个TCP报文段只有同时具备连接的4元组与当前活动窗口的序列号,才会在通信过程中被对方认为是正确的。然而,如果知道序列号、 IP地址以及端口号,那么任何人都能伪造出一个TCP报文段,从而打断TCP的正常连接[RFC5961]。
解决方案:方案一:使初始序列号(或者临时端口号)变得相对难以被猜出;方案二:加密。
综上描述可知,在建立连接前通信双方选择ISN的重要性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值