TCP学习~~

序号占4字节。序号范围是[0,2^32-1],共2^32  (4 284 967 296)个序号。

序号增加到2^32-1后,下一个序号又回到0.也就是说,序号使用mod 2^32运算。

TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。

首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。

Eg.  一报文段的序号字段值是301,而携带的数据共有100字节。

这就表明:本报文段的数据的第一个字节的序号是301,最后一个字节的序号是400.

显然,下一个报文段(如果还有的话)的数据序号应当从401开始,即下一个报文段的序号字段值应为401.这个字段的名称也叫做“报文段序号”


三次握手的过程:



首先由Client发出请求连接即 SYN=1 ACK=0  

TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=client_isn

然后 Server 进行回复确认

即 SYN=1 ACK=1 seq=server_isn(图里画错了), ack=client_isn+1           (seq序号  ack确认序号)

再然后 Client 再进行一次确认,但不用SYN 了,这时即为 ACK=1, seq=client_isn+1, ack=server_isn+1.

然后连接建立.

ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1

SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。

对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此,  SYN置1就表示这是一个连接请求或连接接受报文。

FIN (finis)即完,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。


字段名称

报文1(SYN)

报文2(SYN+ACK)

报文3(ACK)

报文4(数据)

报文5(确认)

序号(Sequence Number

10002000       1001       20011061

确认序号(Ack Number

0

1001

       2001

       1001

ACK

0

1

1

1

1

SYN

1

1

0

0

0

TCP建立连接
TCP建立连接,也就是我们常说的三次握手,它需要三步完成。

在TCP的三次握手中,发送第一个SYN的一端执行的是主动打开。而接收这个SYN并发回下一个SYN的另一端执行的是被动打开。

这里以客户端向服务器发起连接来说明。
1)  第1步:客户端向服务器发送一个同步数据包请求建立连接,该数据包中,初始序列号(ISN)是客户端随机产生的一个值确认号是0
2)  第2步:服务器收到这个同步请求数据包后,会对客户端进行一个同步确认。这个数据包中,序列号(ISN)是服务器随机产生的一个值,确认号是客户端的初始序列号+1
3)  第3步:客户端收到这个同步确认数据包后,再对服务器进行一个确认。

该数据包中,序列号是上一个同步请求数据包中的确认号值,确认号是服务器的初始序列号+1。

注意:因为一个SYN将占用一个序号,所以要加1。

-------------------------------
传输数据的简要过程如下

1)  发送数据:服务器向客户端发送一个带有数据的数据包,该数据包中的序列号和确认号与建立连接第三步的数据包中的序列号和确认号相同;
2)  确认收到:客户端收到该数据包,向服务器发送一个确认数据包,该数据包中,序列号是为上一个数据包中的确认号值,而确认号为服务器发送的上一个数据包中的序列号+上一个数据包中所带数据的大小。
数据分段中的序列号可以保证所有传输的数据按照正常的次序进行重组,而且通过确认保证数据传输的完整性。
--------------------------------------
序列号是上一个收包的确认号不变
确认号是上一个收包的序列号+上一个收包的数据段的大小
(1001+60)



[练习题]

下列TCP连接建立过程描述正确的是:C

A.  服务端收到客户端的SYN包后等待2*ml时间后就会进入SYN_SENT状态
B.  服务端收到客户端的ACK包后会进入SYN_RCVD状态
C.  当客户端处于ESTABLISHED状态时,服务端可能仍然处于SYN_RCVD状态
D.  服务端未收到客户端确认包,等待2*ml时间后会直接关闭连接


解析:

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 
因此,根据第二次握手,A、B错误。
D、服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。所以D错误。 


服务器端首先执行 LISTEN 原语进入被动打开状态( LISTEN ),等待客户端连接;
1.当客户端的一个应用程序发出 CONNECT 命令后,本地的 TCP 实体为其创建一个连接记录并标记为 SYN SENT 状态,然后给服务器发送一个 SYN 报文段

2.服务器收到一个 SYN 报文段,其 TCP 实体给客户端发送确认 ACK 报文段同时发送一个 SYN 信号,进入 SYN RCVD 状态

3.客户端收到 SYN + ACK 报文段,其 TCP 实体给服务器端发送出三次握手的最后一个 ACK 报文段,并转换为 ESTABLISHED 状态

4.服务器端收到确认的 ACK 报文段,完成了三次握手,于是也进入 ESTABLISHED 状态

在此状态下,双方可以自由传输数据。


当一个应用程序完成数据传输任务后,它需要关闭 TCP 连接。假设仍由客户端发起主动关闭连接。
1.客户端执行 CLOSE 原语,本地的 TCP 实体发送一个 FIN 报文段并等待响应的确认(进入状态 FIN WAIT 1 );
2.服务器收到一个 FIN 报文段,它确认客户端的请求发回一个 ACK 报文段,进入 CLOSE WAIT 状态;
3.客户端收到确认 ACK 报文段,就转移到 FIN WAIT 2 状态,此时连接在一个方向上就断开了;
4.服务器端应用得到通告后,也执行 CLOSE 原语关闭另一个方向的连接,其本地 TCP 实体向客户端发送一个 FIN 报文段,并进入 LAST ACK 状态,等待最后一个 ACK 确认报文段;
5.客户端收到 FIN 报文段并确认,进入 TIMED WAIT 状态,此时双方连接均已经断开,但 TCP 要等待一个 2 倍报文段最大生存时间 MSL ( Maximum Segment Lifetime ),确保该连接的所有分组全部消失,以防止出现确认丢失的情况。当定时器超时后, TCP 删除该连接记录,返回到初始状态( CLOSED )。
6.服务器收到最后一个确认 ACK 报文段,其 TCP 实体便释放该连接,并删除连接记录,返回到初始状态( CLOSED )。




















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值