本文主要是介绍TCP和SCTP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、tcp包头
1、源端口、目的端口source port destination port
各占两个字节,分别写入源端口和目的端口。
2、序列号sequence number
4个字节,不会从0或1开始,只是在建立连接时的SYN包里随机生成一个初始序列号。
3、确认号acknowledgement number
4个字节,是期望收到对方下一个报文的第一个数据字节的序号。ack=seq+1
4、数据偏移(头部长度)header length
占4个字节,tcp数据包的首部长度。
5、保留位reserved
6位,保留以后使用,一般为0
6、control flag 控制位
(1)cwr
CWR标志与后面的ECE标志都用于IP首部的ECN字段。ECE标志为1时,则通知对方已将拥塞窗口缩小
(2)ece
ECE 标志表示 ECE-Echo 。置为1时会通知通信对方,从对方到这边的网络有拥塞。在收到数据包的IP首部中ECN为1时将TCP首部中的ECE设置为1.
(3)urg 紧急
urg=1时,标明此报文有紧急数据。
(4)ack
ack=1,建立连接后所有的ack控制位都为1.
(5)psh
该位为1时,表示需要将收到的数据立刻传给上层应用协议。PSH为0时,则不需要立即传而是先进行缓存。
(6)rst
该位为1时,表示TCP连接中出现严重错误必须强制断开连接。
(7)syn
当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1;
(8)fin
该位为1时,表示今后不会再有数据发送,希望断开连接。
8、窗口大小 window size
2个字节,指的是通知接收方,发送本报文你需要有多大的空间来接受。如果窗口为0,则表示可以发送窗口探测,以获知最新的窗口大小。但这个数据必须是1字节
9、校验和 tcp checksum
2个字节,校验首部和数据。
10、紧急指针 urgent pointer
2个字节,与序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。
11、选项options
最常见的可选字段的最长报文大小MSS(Maximum Segment Size),每个连接方通常都在一个报文段中指明这个选项。它指明本端所能接收的最大长度的报文段。
该选项如果不设置,默认为536(20+20+536=576字节的IP数据报)
二、tcp三次握手
• 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers);
• 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
• 第三次握手:客户端收到服务器的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报头的一个标识位。很明显,这两步可以合并,从而提高连接的速度和效率
四、SCTP
流控制传输协议,是一种在网络连接两端之间同时传输多个数据流的协议。SCTP提供的服务于UDP和TCP类似
1、四次握手建立耦联
(1)连接发起者(一般为客户端)SCTP发送一个INIT消息(初始化)。该消息包括了连接发起者的IP地址清单、初始序列号、用于标识本耦联中所有报文的起始标记、客户请求的外出流的数目以及客户能够支持的外来流的数目
(2)对端(服务器)发送一个INITACK消息确认连接发起者的INIT消息,其中含有服务器的IP地址清单、初始序列号、起始标记、服务器请求的外出流的数目、服务器能够支持的外来流的数目以及一个状态cookie,状态cookie包含服务器用于确信本耦联有效所需的所有状态,cookie是经过数字签名的,因而可以确保其有效性
(3)客户以一个COOKIEECHO消息返回服务器的状态cookie,除COOKIEECHO外,该消息可能在同一个报文中捆绑一个用户数据
(4)服务器以一个COOKIEACK消息确认客户返回的cookie是正确的,到此时该耦联就建立成功了。该消息也可能在同一个报文中捆绑一个用户数据。
服务端接收init不保存不分配资源,可以防止SYN等DOS攻击。
2、三次握手断开耦联
(1)应用程序发出关闭请求,SCTP耦联进入SHUTDOWN-PENDING状态,并且不再接收应用程序的数据,只发送队列中还未发送的数据,再队列中没有待发送数据后,发送SHUTWODN并进入SHUTDOWN-SENT状态。这一方被称为主动关闭。
(2)执行被动关闭的一方在接收到主动关闭一方的SHUTWODN消息时,进入SHUTDOWN-RECEIVED状态,此时执行被动关闭一方不再接受上层应用的数据,只发送队列中剩余的数据。在发送队列中的数据被发送完后,执行被动关闭一方发送SHUTDOWN-ACK并进入SHUTDOWN-ACK-SENT状态。
(3)执行主动关闭一方收到SHUTDOWN-ACK后就发送SHUTDOWN-COMPLETE,并进入CLOSE状态。
3、 TCP是以字节为单位传输的,SCTP是以数据块(DATA CHUNK)为单位传输的
4、tcp是双方各自单ip建立连接、单路径传输,SCTP可以多ip耦联,多路径传输。
5、TCP是单流有序传输,SCTP可以多流独立有序/无序传输
这篇关于TCP和SCTP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!