TCP和UDP

一.网络模型

1.七层网络模型

应用层

表示层

会话层

传输层

网络层

数据链路层

物理层

2.五层网络模型

应用层

运输层

网络层

数据链路层

物理层

3.四层网络模型(TCP/IP分层模型)

应用层 HTTP、FTP、SMTP

传输层 TCP、UDP

网间层 IP

网络接口 ARP

二.TCP

1.TCP头部

TCP和UDP

16位端口号:8位源端口(source port):自动选择、8位源端口(destination port):知名端口号

32位***:seq

32位确认号:ACK

4位offset:首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值

6位reserved:保留

6位标志位:

URG:紧急指针标志

ACK:确认序号标志

PSH:尽快接受标志

RST:重置链接标志

SYN:同步序号标志

FIN:释放连接标志

16位窗口大小:告知发送端接收端的缓存大小

16位校验和:奇偶校验

16位紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。

32位TCP选项:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍

2.TCP3次握手

TCP和UDP

2.1第一次握手:

客户端向服务端发送连接请求报文段(SYN=1,ACK=0,seq=x),请求发送后,客户端便进入SYN-SENT状态

2.2第二次握手:

服务端收到连接请求报文段后,如果同意连接,则会发送一个应答(SYN=1,ACK=1,seq=y,ack=x+1),发送完成后便进入SYN-RCVD状态

2.3第三次握手:

当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发来的连接同意应答成功收到

(ACK=1,seq=x+1,ack=y+1),客户端发送后进入ESTABLISHED状态,服务端收到应答也进入ESTABLISHED状态

2.4为什么建立需要三次?

防止失效的连接请求报文段被服务端接收,从而产生错误

若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源

3.TCP4次挥手

TCP和UDP

TCP连接是双向的,因此在四次挥手中,强二次挥手用于断开一个方向的连接,后两次挥手用于断开另一个方向的连接

3.1第一次挥手

客户端向服务端发送连接释放请求(FIN=1,seq=u),然后客户端进入FIN-WAIT-1状态

3.2第二次挥手

服务端收到释放连接请求后,通知相应的应用程序,告诉它客户端向服务端这个方向的连接已经释放。此时B进入CLOSE_WAIT状态,并向客户端发送释放连接的应答(ACK=1,seq=v,ack=u+1)

 客户端收到应答,进入FIN-WAIT-2状态,等待B发送连接释放请求

第二次挥手完成后,客户端到服务器端连接已经四方,服务器不会再接收数据,客户端不会再发送数据,但是服务器仍然可以给客户端发送数据

3.3第三次握手

当服务器向客户端发完所有数据后,向客户端发送连接释放请求(FIN=1,ACK=1,seq=w,ack=u+1),进入LAST-ACK状态

3.4第四次握手

客户端收到请求后。向服务器发送确认应答,客户端进入TIME-WAIT状态,该状态会持续2ML时间,如果该时间内没有服务端重发请求的话,进入CLOSED状态,撤销TCP。服务端收到确认应答后,也进入CLOSED状态,撤销TCP

3.5为什么A要先进入TIME-WAIT状态,等待2MSL时间后才进入CLOSED状态 

为了保证B能收到A的确认应答。 
若A发完确认应答后直接进入CLOSED状态,那么如果该应答丢失,B等待超时后就会重新发送连接释放请求,但此时A已经关闭了,不会作出任何响应,因此B永远无法正常关闭

4.TCP常见状态

CLOSED:初始状态,表示没有任何连接。

LISTEN:Server端的某个Socket正在监听来自远方的TCP端口的连接请求。

SYN_SENT:发送连接请求后等待确认信息。当客户端Socket进行Connect连接时,会首先发送SYN包,随即进入SYN_SENT状态,然后等待Server端发送三次握手中的第2个包。

SYN_RECEIVED:收到一个连接请求后回送确认信息和对等的连接请求,然后等待确认信息。通常是建立TCP连接的三次握手过程中的一个中间状态,表示Server端的Socket接收到来自Client的SYN包,并作出回应。

ESTABLISHED:表示连接已经建立,可以进行数据传输。

FIN_WAIT_1:主动关闭连接的一方等待对方返回ACK包。若Socket在ESTABLISHED状态下主动关闭连接并向对方发送FIN包(表示己方不再有数据需要发送),则进入FIN_WAIT_1状态,等待对方返回ACK包,此后还能读取数据,但不能发送数据。在正常情况下,无论对方处于何种状态,都应该马上返回ACK包,所以FIN_WAIT_1状态一般很难见到。

FIN_WAIT_2:主动关闭连接的一方收到对方返回的ACK包后,等待对方发送FIN包。处于FIN_WAIT_1状态下的Socket收到了对方返回的ACK包后,便进入FIN_WAIT_2状态。由于FIN_WAIT_2状态下的Socket需要等待对方发送的FIN包,所有常常可以看到。若在FIN_WAIT_1状态下收到对方发送的同时带有FIN和ACK的包时,则直接进入TIME_WAIT状态,无须经过FIN_WAIT_2状态。

TIME_WAIT:主动关闭连接的一方收到对方发送的FIN包后返回ACK包(表示对方也不再有数据需要发送,此后不能再读取或发送数据),然后等待足够长的时间(2MSL)以确保对方接收到ACK包(考虑到丢失ACK包的可能和迷路重复数据包的影响),最后回到CLOSED状态,释放网络资源。

CLOSE_WAIT:表示被动关闭连接的一方在等待关闭连接。当收到对方发送的FIN包后(表示对方不再有数据需要发送),相应的返回ACK包,然后进入CLOSE_WAIT状态。在该状态下,若己方还有数据未发送,则可以继续向对方进行发送,但不能再读取数据,直到数据发送完毕。

LAST_ACK:被动关闭连接的一方在CLOSE_WAIT状态下完成数据的发送后便可向对方发送FIN包(表示己方不再有数据需要发送),然后等待对方返回ACK包。收到ACK包后便回到CLOSED状态,释放网络资源。

CLOSING:比较罕见的例外状态。正常情况下,发送FIN包后应该先收到(或同时收到)对方的ACK包,再收到对方的FIN包,而CLOSING状态表示发送FIN包后并没有收到对方的ACK包,却已收到了对方的FIN包。有两种情况可能导致这种状态:其一,如果双方几乎在同时关闭连接,那么就可能出现双方同时发送FIN包的情况;其二,如果ACK包丢失而对方的FIN包很快发出,也会出现FIN先于ACK到达。

5.TCP超时重传

RTT:往返时间 RTT =a*RTT+(1-a)*rRTT(测量的RTT)

RTO:   推荐重传时间 RTO=RTT*b

Karn算法:N-RTO=c*O-RTO (新的重传时间=系数*旧的重传时间)

6.TCP滑动窗口

cwnd

7.TCP拥塞控制

TCP和UDP

拥塞控制具体过程如下所述。

( 1 ) TCP 连接初始化,将拥塞窗口设置为 1。

( 2 )执行慢开始算法, cwind按指数规律增长,直到 cwind = ssthress 时,开始执行拥塞 避免算法, cwnd 按线性规律增长。

( 3 )当网络发生拥塞,把 ssthresb 值更新为拥塞前 ssthresb 值的一半, cwnd 重新设置为 1, 按照步骤( 2 )执行。 

TCP和UDP

快重传配合使用的还有快恢复算法

 ( 1 )当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把 ssthresh 门限减 半。 但是接下去并不执行慢开始算法。

( 2 )考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为 网络可能没有出现拥塞。 所以此时不执行慢开始算法,而是将 cwnd 设置为 ssthresh 的大小, 然后执行拥塞避免算法
三.UDP

1.UDP报文

TCP和UDP

长度为数据报长度=报文头(固定)+数据长度(非固定)

2.UDP传输

TCP和UDP

 

TCP和UDP区别:

1、TCP面向连接;UDP是无连接的,发送数据之前不需要建立连接
2、TCP提供可靠的服务。通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,不保证可靠交付
3、TCP面向字节流;UDP是面向报文的;

4、UDP不提供网络拥塞控制
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道