TCP:面向连接的可靠连接协议
UDP:非面向连接的不卡靠传输协议
OSI七层参考模型
应用层:为操作系统或网络应用应用程序提供网络的服务的接口,提供用户界面,文件,打印,消息,数据库和应用程序服务
表示层:对上层数据或信息进行变换以保证一个主机应用层信息可以被另一台主机的应用程序理解
会话层:提供主机之间的会话连接,将不同的应用程序的数据分离,对话控制
传输层:数据分段,通过端口号来区分不同的服务,端到端连接,提供可靠或不可靠的传输,在重传之前进行纠错
网络层:路由选择,通过IP地址进行逻辑寻址,路由器使用他们来选择路径
数据链路层:1.MAC媒介访问控制层 2.LLC逻辑链路层为上层提供FCS校验
物理层:定义电器电压、接口规范、光学特性
TCP报文详解
源端口和目的端口:各占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三次握手
• 第一次握手:建立连接时,客户端发送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是可靠的传输控制协议,三次握手能保证数据可靠传输又能提高传输效率。
如果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 是一种传输协议,在TCP/IP协议栈中所处的位置和TCP、UDP类似,兼有TCP/UDP两者特征。提供了和TCP一样的可靠、有序的数据传输功能,同时却能和UDP一样面对消息的方式来进行操作,保护消息边界
SCTP报文格式
SCTP特性
• 多宿主(Multi-Homing)
• 多流(Multi-streaming)
• 初始化保护(Initiation protection)
• 消息分帧(Message framing)
• 可配置的无序发送(Configurable unordered delivery)
• 平滑关闭(Graceful shutdown)
多宿主
SCTP里面引入了联合(Association)的概念
• TCP连接是在两个主机的单个接口之间建立的
• SCTP可以把多条路径合并到一个联合中,数据可以在任意一个连接路径上进行传输
多流
SCTP可以在一个联合中支持多流机制,每个流(stream)都是独立的。
• 每个流都有各自的编号,编码在SCTP报文中
• 阻塞的流不会影响同一联合中的其他流,可以并行进行传输
初始化保护
TCP中的三次握手机制会被利用来进行DoS(Denial of Service)攻击,通过发送大量的SYN报文最终耗尽服务器的资源
SCTP通过引入4次握手机制来避免这种场景:
• 服务器的INIT-ACK中会包含cookie(标识这个连接的唯一上下文);
• 客户端使用这个cookie来进行响应。服务器收到这个响应后,才为这个连接分配资源;
• 为了解决4次握手机制带来的时延,SCTP协议还允许在COOKIE-ECHO和COOKIE-ACK报文中传输数据包
消息分帧
• TCP协议是按照字节流的方式进行数据传输的,并不存在消息边界,比如说音频视频都可以通过流的方式进行传递;
• UDP使用的是消息分帧,发端多大的数据包,收端收到的数据包也是这么大;
SCTP也提供了这种分帧的机制
可配置的无序发送
TCP能确保数据按照次序发送;UDP无法保证消息有序;SCTP中也可以配置成接受无序的消息;
这样的通信方式对于面向消息的传输非常有用,因为每个消息都是各自独立的,次序并不重要。
平滑关闭
TCP和SCTP都是基于连接的协议,完成传输后都需要有一个拆除连接的过程。
TCP中连接的删除是半关闭的,服务的某一端可以关闭自己这端的socket,但是可以继续接受数据。
SCTP协议设计的时候考虑这种半关闭的状态实际上很少使用,所以简化了关闭的过程,一旦某一端发起了连接拆除,对等的两端都关闭。