面试可能会问到:什么是TCP的可靠传输/流量控制/拥塞控制/建立连接释放连接?
传输层有2个协议:UDP用户数据报协议和TCP传输控制协议
TCP应用层协议:HTTP、HTTPS、FTP、SMTP、DNS(表示应用层要是用的是HTTP协议的话,传输层必然用的是TCP协议)
UDP应用层协议:DNS
UDP
UDP首部中,端口号占16位,客户端的源端口是临时开启的随机端口
协议 | 默认端口号 |
HTTP | TCP+80 |
HTTPS | TCP+443 |
FTP | TCP+21 |
MySQL | TCP+3306 |
DNS | UDP/TCP+53 |
SMTP | TCP+25 |
POP3 | TCP+110 |
TCP
标志位:URG(当URG为1时,紧急指针字段才有效);ACK(ACK为1时,确认号字段才有效)
PSH(……);RST(当RST为1时,表明连接中出现严重差错,必须释放连接再重连)
SYN(当SYN=1,ACK=0时表示这是一个建立连接的请求,若对方同一建立连接回复SYN=1,ACK=1)
FIN(当FIN=1,表示数据已发送完毕,要求释放连接)
序号:在建立连接后,这一次给对方的TCP数据部分的第一个字节的编号
确认号:建立连接后,期望对方下一次传过来的TCP数据部分的第一个字节的编号
窗口:有流量控制的功能,告知对方,下一次允许发送的数据大小
TCP的几个要点:
·可靠传输:保证服务器给客户端返回数据时,如果有包丢失了,会补发
·流量控制:告诉服务器我窗口大小,不要发太多太快
·拥塞控制:在流量控制的基础上,再进一步一起维护网络
·连接管理:三次握手,四次挥手
TCP--可靠传输
·停止等待ARQ自动重传请求(每发完一组数据,停止发送,等待对方确认后再发下一组)
·连续ARQ+滑动窗口(发送窗口中的连续分组,发送完之后,停止发送,等待确认)
·SACK选择性确认:TCP只发送丢失的包,已经收到的包会放在TCP头部的可选部分
思考:为什么在传输层就要把数据分成多个段传输,而不是等到在网路层分片传给数据链路层?
因为:可靠传输是在传输层进行控制的,网络层和数据链路层是没有可靠传输功能的,若不在传输层就分成一个一个的段,一旦数据丢失,整个传输层的数据都得重传。
TCP--流量控制(点对点)
什么是流量控制?
让发送方的发送速率不要太快,让接收方来得及处理、
为什么要进行流量控制?
如果接收方的缓存区满了,发送方还在疯狂发数据,接收方只能把收不下的数据包丢掉,大量的丢包会极大地浪费网络资源
TCP--拥塞控制(全局性)
作用:防止过多的数据注入到网络中,避免网络中的路由器过载
方法:
·慢开始:cwnd初值很小,随着接收方的确认,成倍增长
·拥塞避免:设置一个ssthred慢开始阈值,慢开始一段时间后,达到ssthred,以线性方式增加cwnd,当出现网络拥塞时,把拥塞峰值的一半作为ssthread,又从最初的慢开始设置的cwnd开始执行……
·快速重传:接收方只要接收到了一个失序的分组就给发送方发确认,发送方只要收到连续3个确认,就立刻重传丢失的报文
·快速恢复:出现拥塞控制后,不是从慢开始最初的cwnd开始,而是把cwnd设为新的ssthread,然后用拥塞避免线性增大
MSS:每个段最多能传多少字节(建立连接是在TCP头部可选部分表明,双方择其最小值)
rwnd:接收窗口
cwnd:拥塞窗口
swnd:发送窗口
swnd=min(rwnd,cwnd)
当rwnd<cwnd,是接收方的接受能力限制发送窗口的最大值
cwnd<rwnd是网络的拥塞限制
TCP--建立连接-3次握手
在Windows上可以用netstat -ant -p TCP查看TCP状态,基本上只能看到Listen和Established
CLOSED:客户端处于关闭状态
SYN-SENT:客户端已经向服务端发起请求建立连接的报文,等待Server回复
LISTEN:服务端处于监听状态
SYN-RCVD:服务端收到了客户端发来的连接请求,返回给客户端ACK,等待客户端最终确认
ESTABLISHED:请求已经成功建立
前2次握手,TCP头部会放一些双方交换确认的信息,如MSS,窗口等,是否支持SACK
为什么要建立3次握手?2次不行吗?
建立3次握手的主要目的:为了防止已失效的连接请求报文段突然又传送到了服务端,防止Server端一直等待,浪费资源,产生错误。
TCP--建立连接-释放连接-4次挥手
Client和Server谁想先发起断开连接都行。这里我们假设的是Client想先断开
FIN-WAIT-1:Client给Server发送了FIN报文,进入终止等待1。
FIN-WAIT-2:当收到了对方的ACK后,进入终止等待2。
CLOSE-WAIT:收到对方断开连接的请求就进入关闭等待状态,并回应对方一个ACK表示我收到了
LAST-ACK:被关闭一方发送FIN后进入最后确认状态,等待对方最后的ACK,收到后就可以进入CLOSED了
TIME-WAIT:收到了对方的FIN,并发送ACK报文,等2MSL后就可以进入CLOSED状态
有时候抓包工具会显示,第2、3次挥手合并了(表示我知道你没数据发了,同时我也没数据发了)
MSL:最大分段生存期,是指TCP报文在因特网上的最大生存时间,一般是2分钟。
为什么要等2MSL后再断开?即 TIME - WAIT 状态的作用是什么?
------1.可以防止本次连接中产生的数据包误传到下一次连接中(因为客户端的端口是随机的,可能存在上一次连接的端口和下一次的端口刚好是一个的情况,设置为2MSL可以避免误传)。
-------2.为了保证客户端发送的最后1个连接释放确认报文 能到达服务器,从而使得服务器能正常释放连接 (客户端的第四次挥手可能丢失,如果立马关闭连接,服务器收不到客户端的最后一个释放报文会重发,此时客户端已经关闭了,会导致服务端连接关闭不了。
所以客户端要等到2倍报文存活时间,确保服务端关闭)
为什么要进行4次挥手?
因为TCP是全双工模式,释放连接后,双方都无法都无法接收 / 发送消息给对方。——第1次挥手:主机1告诉主机2,主机1已经没有数据要发给主机2了,但是主机1依然可以接收主机2发送来的数据。第2次挥手:表示主机2知道主机1没有数据要发了,但是主机2还是可以给主机1发的。第3次挥手:表示主机2告诉主机1,主机2已经没有数据要发给主机1了。第4次挥手:表示主机1知道主机2没有数据要发了,随后断开整个连接。