TCP和UDP
一.网络模型
1.七层网络模型
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
2.五层网络模型
应用层
运输层
网络层
数据链路层
物理层
3.四层网络模型(TCP/IP分层模型)
应用层 HTTP、FTP、SMTP
传输层 TCP、UDP
网间层 IP
网络接口 ARP
二.TCP
1.TCP头部
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次握手
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连接是双向的,因此在四次挥手中,强二次挥手用于断开一个方向的连接,后两次挥手用于断开另一个方向的连接
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拥塞控制
拥塞控制具体过程如下所述。
( 1 ) TCP 连接初始化,将拥塞窗口设置为 1。
( 2 )执行慢开始算法, cwind按指数规律增长,直到 cwind = ssthress 时,开始执行拥塞 避免算法, cwnd 按线性规律增长。
( 3 )当网络发生拥塞,把 ssthresb 值更新为拥塞前 ssthresb 值的一半, cwnd 重新设置为 1, 按照步骤( 2 )执行。
快重传配合使用的还有快恢复算法
( 1 )当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把 ssthresh 门限减 半。 但是接下去并不执行慢开始算法。
( 2 )考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为 网络可能没有出现拥塞。 所以此时不执行慢开始算法,而是将 cwnd 设置为 ssthresh 的大小, 然后执行拥塞避免算法
三.UDP
1.UDP报文
长度为数据报长度=报文头(固定)+数据长度(非固定)
2.UDP传输
TCP和UDP区别:
1、TCP面向连接;UDP是无连接的,发送数据之前不需要建立连接
2、TCP提供可靠的服务。通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,不保证可靠交付
3、TCP面向字节流;UDP是面向报文的;
4、UDP不提供网络拥塞控制
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道