TCP、STCP

TCP报头

在这里插入图片描述

  • 端口号:用来标识同一台计算机的不同的应用进程。
    1)源端口:源端口和IP地址的作用是标识报文的返回地址。
    2)目的端口:端口指明接收方计算机上的应用程序接口。
    源端口和目的端口,各占2个字节,分别写入源端口和目的端口;
  • 序号,占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号。例如,一段报文的序号字段值是 301 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从401开始;
  • 确认号,占4个字节,是期望收到对方下一个报文的第一个数据字节的序号。例如,B收到了A发送过来的报文,其序列号字段是501,而数据长度是200字节,这表明B正确的收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701;
  • 数据偏移/头部长度,占4位,它指出TCP报文的数据距离TCP报文段的起始处有多远;
  • 保留,占6位,保留今后使用,但目前应都位0;
  • 紧急URG,当URG=1,表明紧急指针字段有效。告诉系统此报文段中有紧急数据;确认ACK,仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1;
  • 推送PSH,当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应,这时候就将PSH=1;
  • 复位RST,当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接;
  • 同步SYN,在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1;
  • 终止FIN,用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放;
  • 窗口,占2字节,指的是通知接收方,发送本报文你需要有多大的空间来接受;
  • 检验和,占2字节,校验首部和数据这两部分;
  • 紧急指针,占2字节,指出本报文段中的紧急数据的字节数;
  • 可选项,长度可变,定义一些其他的可选的参数。

TCP连接的三次握手

在这里插入图片描述

  1. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers);
  2. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
  3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手;

补充知识:

未连接队列
在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于SYN_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。

TIME_WAIT状态
TIME_WAIT状态存在有两个原因。
<1>可靠终止TCP连接。如果最后一个ACK报文因为网络原因被丢弃,此时server因为没有收到ACK而超时重传FIN报文,处于TIME_WAIT状态的client可以继续对FIN报文做回复,向server发送ACK报文。
<2>保证让迟来的TCP报文段有足够的时间被识别和丢弃。连接结束了,网络中的延迟报文也应该被丢弃掉,以免影响立刻建立的新连接。

追问:为什么需要三次?
TCP是可靠的传输控制协议,三次握手能保证数据可靠传输又能提高传输效率。

如果TCP的握手是两次:

  1. 如果client发给server的SYN报文因为网络原因,延迟发送。由于client没有收到server对SYN的确认报文,会重发SYN报文,服务器和回复ACK,连接建立。数据发送完毕,这条连接被正常关闭。这时,延迟的SYN报文发到了server,server误以为这是client重新发送的同步报文,又回复了一个ACK,和client建立了连接。
  2. 如果server给client发送的ACK报文因为网络原因,报文被丢弃,此时server认为已经建立好连接,但是client没有收到确认报文,认为没有建立好连接。client会重发SYN报文,此时server已经处于就绪状态,认为已经建立好连接。

如果TCP的握手是四次

  1. client给server发送SYN同步报文;
  2. server收到SYN后,给client回复ACK确认报文;
  3. server给client发送SYN同步报文;
  4. client给server发送ACK确认报文。

第2.3步之间,server和client没有任何的数据交互,分开发送相当于多发了一次TCP报文段,SYN和ACK标识只是TCP报头的一个标识位。很明显,这两步可以合并,从而提高连接的速度和效率。

TCP断开的四次挥手

在这里插入图片描述

  1. 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送
  2. 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号
  3. 服务器B关闭与客户端A的连接,发送一个FIN给客户端A
  4. 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1

为什么连接的时候是三次握手,关闭的时候却是四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

拓展问题:

为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

追问:为什么是四次?
TCP是全双工的连接,必须两端同时关闭连接,连接才算真正关闭。 如果一方已经准备关闭写,但是它还可以读另一方发送的数据。发送给FIN结束报文给对方对方收到后,回复ACK报文。当这方也已经写完了准备关闭,发送FIN报文,对方回复ACK。两端都关闭,TCP连接正常关闭。

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
· 网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
· 可以确保每成功建立一个TCP连接时,来自该连接先前化身的老的重复分组都已经在网络中消逝。

流控制传输协议(SCTP)

1)在客户和服务器之间提供关联,并像TCP那样给应用提供可靠性、排序、流量控制以及全双工的数据传送;
2)一个关联指代两个系统之间的一次通信,它可能因为SCTP支持多宿而设计不止两个地址;
3)与TCP不同的是,SCTP是面向消息的。它提供各个记录的按序递送服务;
4)与UDP一样,有发送端写入的每条记录的长度随数据一道传递给接收端应用;
5)能够在所连接的端点之间提供多个流,每个流各自可靠第按序递送消息;
6)提供多宿性,使得单个SCTP端点能够支持多个IP地址;
UDP:简单的、不可靠的、无连接的、提供消息边界的数据报协议
TCP:复杂的、可靠的、面向连接的、无消息边界的字节流协议
SCTP:可靠的、面向连接的,流控制传输协议,提供消息边界、传输级别多宿支持以及线头阻塞减少到最小的一种方法

和TCP的区别

SCTP可以看做是对TCP进行了增强的传输层协议,和TCP的不同包括:

  1. 支持多宿主:SCTP的每一端都可以提供多个IP地址,对于对端提供的每个IP地址,SCTP都会通过HEARD_BEAT机制来检测其可达性,当其中一个IP地址由于网络故障而不可达时,SCTP会将报文送到一个可达的地址。通过这种方式,SCTP提高了可靠性,可以容忍网络级错误。
  2. 支持多种传输模式:除了支持TCP的严格有序传输完,SCTP还支持部分有序传输和无序传输(像UDP)。
  3. 支持多流:TCP以字节流的方式工作,通过TCP连接传输的数据以字节流的方式在TCP连接的两端之间流动。但是在SCTP中,流用来指示需要按顺序递交到上层协议的用户消息的序列,在同一个流中的消息需要按照其顺序进行递交。严格地 说,“流”就是一个SCTP 偶联中,从一个端点到另一个端点的单向逻辑通道。一 个偶联是由多个单向的流组成的。各个流之间相对独立,使用流ID 进行标识,每个 流可以单独发送数据而不受其他流的影响。
  4. 路径管理:SCTP 路径管理功能主要负责从远端提供的一组传输地址中选择目的传输地址,它根据SCTP用户的指令和当前可达的目的地来选择目的地址。在SCTP建立耦联时,会向对端通告本端可用的所有地址,并且会获取对端的所有可用地址。随后SCTP会通过HEART_BEAT定时检测对端所有地址的可达性。
  5. 选择性确认(SACK):在TCP中其确认机制的基础是累积确认,SACK是选项,不一定启用,但是SCTP中是必须使用的。SCTP使用SACK反馈给发送端的是丢失的并且要求重传的消息序号。
  6. 防范拒绝服务(DoS)攻击:SYN Flooding攻击是DoS的一种方式,TCP的实际实现中通过扩展实现了对它的防御,但是在SCTP协议中已经增加了对它的防御。方法是在耦联初始化阶段实施一种安全的“Cookie”机制。
  7. 根据已发现的路径MTU(最大传输单元)大小进行用户数据分片: TCP根据MSS确定发送给对端的最大字节长度,MSS可能来自于路径MTU发现也可能不是来自于路径MTU发现。但是对于SCTP,为了确保发送到下层的SCTP数据包与路径MTU一致进而避免分片,SCTP对用户消息分片。在接收端,分片被重组后传给上层SCTP用户。
  8. 验证标签:SCTP 报文的公共分组头包含一个验证标签(VerificATIon Tag)。 验证标签的值由偶联两端在偶联启动时选择。如果收到的分组中如果没有期望的验证标签值,接收端将丢弃这个分组,以阻止攻击和失效的SCTP 分组。这个特性也使得SCTP可以区分SCTP报文段是属于本耦联的还是本耦联所用的四元组的上一个实例的。
  9. 消息块绑定:类似于TCP当用户数据很短时,数据传输的效率会很低。为了应对该问题,SCTP会将几个用户数据绑定在一个SCTP 报文里面传输,以提高带宽的利用率。用户可以选择是否启用该功能,但是当出现拥塞/重传时即便用户选择不使用该功能,该功能也仍会被使用。相比之下TCP需要打开TCP_CORK 选项的支持才能获得类似的功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值