
网络基础(四)——TCP协议
TCP(传输控制协议):面向连接的可靠传输协议:
- TCP报头
- 三次握手
- 四次断开
UDP(用户数据报文协议):非面向连接的不可靠传输协议:
- UDP报头
拓展知识:
- TCP数据的可靠性具体体现?
- TCP和UDP的区别?
- SCTP协议(流控制传输协议)
- 思维导图
TCP(传输控制协议):面向连接的可靠传输协议
面向连接体现在:三次握手
可靠体现在:确认(ack)、重传(rst)、排序、流控(滑动窗口)
TCP报头:
- 源端口号、目的端口号:16bit–2字节,分别写入源端口和目的端口
- 序列号:32bit–4字节,指的是本报文段所发送数据的第一个字节的序号(TCP连接中传送的字节流中的每个字节都按顺序编写)
- 确认号:32bit–4字节,是期望收到对方的下一个报文段的数据的第一个字节的序号,即上次已成功接收的数据字节序号+1(只有acl标识为1,此字段有效)
- 数据偏移(首部长度):4bit,记录头部有几个长度,记录报头数;
- 保留位:目前都是0
- 标记位:
-urg(紧急):=1,表明紧急指针字段有效(告诉系统此报文段中有紧急数据,相当于高优先级的数据)
-ack(确认):=1,确认字段有效,表示连接已建立
-psh(推送):=1,进行交互通信时,尽快把报文交给应用层,希望立即收到对方的响应
-rst(复位):=1,TCP连接出现严重差错,必须释放连接,重新建立连接(重传)
-syn(同步):=1,表示这是一个连接请求或连接接受请求。在连接建立时用来同步序号,用来发起一个连接。(当syn=1,ack=0,表明是连接请求报文;若同意连接,响应报文中syn=1,ack=1)
-fin(终止):=1,表明报文发送方的数据已发送完毕,并且要求释放(用来释放连接) - 窗口:16bit–2字节,TCP流量控制,通知对方,发送报文你需要多大的空间来接受
- 校验和:16bit–2字节,校验字段,包括TCP首部和TCP数据这两部分
- 紧急指针:16bit–2字节,只有当urg标志置1时紧急指针才有效(指出本报文段中的紧急数据的字节数)
- 选项:长度可变,定义一些其他的可选参数
- 数据:TCP负载
tcp报头示例:
三次握手
1、过程:
- 客户端发送SYN包(syn=j)到服务器,进入SYN_SENT状态,等待服务器确认(syn:同步序列编号);
- 服务器收到SYN包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
- 客户端收到服务的SYN+ACK包,向服务器发送确认包(ack=k+1),此时包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)。
2、如果是两次握手呢?
导致client和server两端信息不匹配。
- 本来要断开,但是因为延时报文到又连接上:
(1)如果client发给server的SYN报文因网络原因延迟发送。
(2)由于client没收到对SYN的确认报文,会重发SYN报文,server回复ACK,建立连接。数据发送完毕,这条连接将被正常关闭。
(3)这时,延迟发送的SYN传到了server,server误以为是client重新发送的同步报文,就又回复ACK,又建立连接了。 - server认为连接,client以为断开:
(1)如果server给client发送的ACK报文因为网络原因,报文被丢弃,此时server认为已经建立好连接;
(2)client会重发SYN报文,此时server已经处于就绪状态,认为已经建立好连接。
3、四次握手呢?
四次过程:
- client给server发送SYN同步报文
- server收到SYN后,给client回复ACK确认报文
- server给client发送SYN同步报文
- client给server发送ACK确认报文
第2、3步之间,server和client没有任何的数据交互,分开发送相当于多发了一次TCP报文段。SYN和ACK标识只是TCP报头的一个标识位。很明显,这两步可以合并,从而提高连接的速度和效率。
四次挥手
1、过程:
- client发送一个FIN,用来关闭client到server的数据传递;
- server收到FIN,它会回复一个ACK,确认序号为收到的序号加1,和SYN一样,一个FIN将占用一个序号;
- server关闭与client的连接,发送一个FIN给clien;
- client回复ACK确认报文,即将确认序号设置为收到序号加1。
2、为什么连接的时候是三次握手,关闭的时候是四次握手?
- 连接时:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文,其中ACK报文是用来应答的,SYN报文是用来同步的。两者可以合并。
- 断开时:当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。
- TCP是全双工的连接,必须两端同时关闭连接,连接才算真正关闭。
UDP(用户数据报文协议):非面向连接的不可靠传输协议
UDP报头:
- 源端口、目的端口:各2个字节
- 长度:2字节,UDP首部加上UDP数据的字节数
- 校验和:2字节,覆盖UDP首部和UDP数据,是可选的
- 数据:负载
UDP报头示例:
拓展知识
1、简述TCP协议在数据传输过程中收发双方是如何保证数据包的可靠性的?
- 为了保证数据包的可靠传递,发送方必须把已发送的数据包保留在缓冲区;
- 并为每个已发送的数据包启动一个超时定时器;
- 如在定时器超时之前收到了对方发来的应答信息(可能是对本包的应答,也可以是对本包后续包的应答),则释放该数据包占用的缓冲区;
否则,重传该数据包,直到收到应答或重传次数超过规定的最大次数为止。 - 接收方收到数据包后,先进行CRC校验,如果正确则把数据交给上层协议,然后给发送方发送一个累计应答包,表明该数据已收到,如果接收方正好也有数据要发给发送方,应答包也可放在数据包中捎带过去。
2、描述TCP和UDP的区别?
- TCP是基于连接的,提供可靠传输;而UDP是基于无连接的,不提供可靠传输;
- UDP报文是面向数据报文的,TCP是面向数据流的;
- UDP的报文简单,因此传输效率高;
- TCP只能提供点到点通信,但是UDP支持单播、组播和广播
3、SCTP协议(流控制传输协议)
是一种在网络连接两端之间同时传输多个数据流的协议。SCTP提供的服务于UDP和TCP类似。
- 连接发起者(一般为客户端)SCTP发送一个INIT消息(初始化);
【该消息包括了连接发起者的IP地址清单、初始序列号、用于标识本耦联中所有报文的起始标记、客户请求的外出流的数目以及客户能够支持的外来流的数目】 - 对端(服务器)发送一个INITACK消息确认连接发起者的INIT消息;
【其中含有服务器的IP地址清单、初始序列号、起始标记、服务器请求的外出流的数目、服务器能够支持的外来流的数目以及一个状态cookie,状态cookie包含服务器用于确信本耦联有效所需的所有状态,cookie是经过数字签名的,因而可以确保其有效性】 - 客户以一个COOKIEECHO消息返回服务器的状态cookie;
【除COOKIEECHO外,该消息可能在同一个报文中捆绑一个用户数据】 - 服务器以一个COOKIEACK消息确认客户返回的cookie是正确的,到此时该耦联就建立成功了。
【该消息也可能在同一个报文中捆绑一个用户数据】
- 断开连接:三次握手
SCTP不支持TCP所支持的“半关闭”状态
- 应用程序发出关闭请求,SCTP耦联进入SHUTDOWN-PENDING状态,并且不再接收应用程序的数据,只发送队列中还未发送的数据;
再队列中没有待发送数据后,发送SHUTWODN并进入SHUTDOWN-SENT状态。这一方被称为主动关闭。 - 执行被动关闭的一方在接收到主动关闭一方的SHUTWODN消息时,进入SHUTDOWN-RECEIVED状态,此时执行被动关闭一方不再接受上层应用的数据,只发送队列中剩余的数据;
在发送队列中的数据被发送完后,执行被动关闭一方发送SHUTDOWN-ACK并进入SHUTDOWN-ACK-SENT状态。 - 执行主动关闭一方收到SHUTDOWN-ACK后就发送SHUTDOWN-COMPLETE,并进入CLOSE状态;
执行主动关闭一端接收到SHUTDOWN-COMPLETE后就进入close状态
以上综合成思维导图: