TCP协议

目录

一、TCP协议头部格式

二、连接的三次握手 (握手过程中传送的包里不包含数据)

三、四次分手

五. TCP的MSS简介

六、TCP滑动窗口


一、TCP协议头部格式

1.  Source Port和Destination Port:(分别占2bytes),表示源端口号和目的端口号;用于区别主机中的不同进程,而IP地址是用来区分不同的主机的,源端口号和目的端口号配合上IP首部中的源IP地址和目的IP地址就能唯一的确定一个TCP连接;

2. Sequence Number: (4bytes),用来标识TCP发端向TCP收端发送的数据字节流它表示在这个报文段中的的第一个数据字节在数据流中的序号;主要用来解决网络报乱序的问题

3. Acknowledgment Number:(4bytes)确认序列号包含 发送端所期望收到的下一个序号,因此,确认序号应当是上次已成功收到数据字节序号加1。不过,只有当标志位中的ACK标志(下面介绍)为1时该确认序列号的字段才有效。主要用来解决不丢包的问题;

4. Offset:(4bit)表示TCP首部的长度,需要这个值是因为任选字段的长度是可变的。这个字段占4bit,单位是4字节,(最多能表示15个32bit的的字,即4*15=60个字节的首部长度),因此TCP最多有60字节的首部。然而,没有任选字段,正常的长度是20字节;

5. TCP Flags (8bit)

  • URG:此标志表示TCP包的紧急指针域(后面马上就要说到)有效,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据;
  • ACK此标志表示应答域有效,就是说前面所说的TCP应答号将会包含在TCP数据包中;有两个取值:01,为1的时候表示应答域有效,反之为0
  • PSH:这个标志位表示Push操作。所谓Push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队;
  • RST:这个标志表示连接复位请求。用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包;
  • SYN表示同步序号,用来建立连接SYN标志位和ACK标志位搭配使用,当连接请求的时候,SYN=1ACK=0;连接被响应的时候,SYN=1ACK=1;这个标志的数据包经常被用来进行端口扫描。扫描者发送一个只有SYN的数据包,如果对方主机响应了一个数据包回来 ,就表明这台主机存在这个端口;但是由于这种扫描方式只是进行TCP三次握手的第一次握手,因此这种扫描的成功表示被扫描的机器不很安全,一台安全的主机将会强制要求一个连接严格的进行TCP的三次握手;
  • FIN 表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开。这个标志的数据包也经常被用于进行端口扫描。

6. 校验和 checksum(2bytes)

检验和覆盖了整个的TCP报文段: TCP首部和TCP数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。

7. 紧急指针(6bit)

注:一般不使用。

只有当U R G标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。

二、连接的三次握手 (握手过程中传送的包里不包含数据)


  1. 第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1Sequence Numberx;然后,客户端进入SYN_SEND状态,等待服务器的确认;
  2. 第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Numberx+1(Sequence Number+1);同时,自己还要发送SYN请求信息,将SYN位置为1Sequence Numbery;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
  3. 第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

为什么要三次握手

  • 第一次握手: A给B打电话说,你可以听到我说话吗?
  • 第二次握手: B收到了A的信息,然后对A说: 我可以听得到你说话啊,你能听得到我说话吗?  
  • 第三次握手: A收到了B的信息,然后说可以的,我要给你发信息啦!

在三次握手之后,A和B都能确定这么一件事: 我说的话,你能听到; 你说的话,我也能听到。 这样,就可以开始正常通信了。

如果四次,那么就造成了浪费,因为在三次结束之后,就已经可以保证A可以给B发信息,A可以收到B的信息; B可以给A发信息,B可以收到A的信息。

三、四次分手

  1. 第一次分手:主机A(可以是客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机B发送一个FIN报文段;此时,主机A进入FIN_WAIT_1状态;这表示主机A没有数据要发送给主机B了,但是主机A还是可以接受数据的
  2. 第二次分手:主机B收到了主机A发送的FIN报文段,向主机A回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机A进入FIN_WAIT_2状态;主机B告诉主机A,我“同意”你的关闭请求;
  3. 第三次分手:主机B向主机A发送FIN报文段,请求关闭连接,同时主机B进入LAST_ACK状态
  4. 第四次分手:主机A收到主机B发送的FIN报文段,向主机B发送ACK报文段,然后主机A进入TIME_WAIT状态;主机B收到主机AACK报文段以后,就关闭连接;此时,主机A等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机A也可以关闭连接了

MSL即Maximum Segment Lifetime,就是最大报文生存时间,是任何报文在网络上的存在的最长时间,超过这个时间报文将被丢弃。《TCP/IP详解》中是这样描述的:MSL是任何报文段被丢弃前在网络内的最长时间。RFC 793中规定MSL为2分钟,实际应用中常用的是30秒、1分钟、2分钟等。

等待2MSL时间主要目的是:防止最后一个ACK包对方没有收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包

为什么是四次挥手,而不是三次或是五次、六次? 
双方关闭连接要经过双方都同意。

五. TCP的MSS简介

    MSS:maximum segment size 最大片段长度,是TCP一个报文能够传输的数据(不包括协议头的开销)的最大值,设置了mss,能够避免IP分片和重组。

    MSS=MTU-IP头部-TCP头部

    在TCP三步握手的SYN和SYN ACK报文里面,客户端和服务器会协商MSS的大小,MSS的值是取两个报文里面小的值作为MSS的值

六、TCP滑动窗口

1. 场景类比:

同学 Luffy 给你打电话,让你记下一串手机号码,可是你记忆力不太好,你跟 Luffy 约定,一次只最多只能报 4 个数字,Luffy 念一遍,如果你听到了就把他说的话重复一遍。接下来:

你:你一次最多报 4 个数字,多了我记不住啊!

Luffy:139

你:139 (Luffy 知道你听到了)

Luffy:7548

你:7538 (很明显你听错了)

Luffy:不对,是7548

你:7548

Luffy : 2669

你:2669

上面的场景,你一次最多只能接受 4 个数字,表示你的滑动窗口大小就是 4. TCP 协议中,也有这样的滑动窗口,它的大小表示目前还能接收多少字节的数据

2. TCP 中,滑动窗口是为了实现流量控制。如果对方发送数据过快,接收方就来不及接收(你来不急记住),接收方就需要通告对方,减慢数据的发送

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值