计算机网络部分
TCP的三次握手和四次挥手
三次握手 第一次握手:Client将标志位置为1,随机产生一个seq=x,并将改数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
第二次握手:Server收到数据包后将标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个seq=y,并将数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
第三次握手:Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确将标志位ACK置为1,ack=y+1,并将数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client和Server之间可以进行传输数据。
四次挥手 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态
第二次挥手:Server收到FIN后,发送一个ACK到Client,确认序号为收到序号u+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号w+1,Server进入CLOSED状态,完成四次挥手。
TCP与UDP之间的不同
- TCP面向连接,udp是无连接的,即发送数据之前是不需要建立连接的
- TCP提供可靠地服务,也就是说,通过TCP连接传送的数据无差错,不丢失,不重复,且按序到达,UDP尽最大努力交付。
- TCP面向字节流,实际是TCP把数据看成一连串无结构的字节流,UDP是面向报文的,UDP没有拥塞控制
- TCP连接是点对点的,UDP支持一对一,一对多,多对一,多对多的交互通信。
- TCP首部开销20字节,UDP8个字节。
- TCP的逻辑信道是全双工的可靠信道,UDP是不可靠信道。
为什么需要三次握手?
** 答:** 1. 防止已经失效的建立连接请求“死灰复燃”,如果之前我们发送的请求连接在网络中某个地方被阻塞了,得不到服务端的响应,但是在某个节点突然被服务端接收到了,服务端开始发送第二次确认握手(同意建立连接),但是这并不是我们当前需要的连接,所以为了不让服务端等待客户端发送数据的状况出现,我们需要三次握手来进行确认连接,在没收到客户端的连接确认时,服务端不会与客户端进行连接。 2. 可以用来检测当前连接是否正常。TCP是全双工通信方式,当服务端发送给服务端请求连接信号且服务端发送确认连接信号给服务端,客户端能够正常接收到此确认信号,这可以证明客户端的发送和服务端的接收没问题;当客户端接收到服务端的确认信号并发送确认信号给服务端且服务端可以正确接收到此确认信号,可以证明客户端接收和服务端发送没问题。
为什么需要四次挥手?
** 答:** 由于连接关闭的控制权在应用层,所以被动关闭方接收到FIN请求时,TCP协议栈会发送一个ACK确认包,优先关闭一方通信,之后通知应用层,由应用层决定什么时候发送FIN包。应用层可以调用系统函数read() == 0,判断对端是否已经关闭连接了。
为什么在四次挥手过程中需要等待2MSL时间呢?
** 答:** 1. 如果主动关闭方在第四次挥手的时候没有进行TIME_WAIT状态等待而直接进入关闭状态,则如果被动关闭方没有接收到ACK信号的时候,就会不断发送FIN信号并等待主动关闭方应答,被动关闭方一直处于未关闭状态。 2. 如果主动关闭方不进行2MSL等待直接进入CLOSED,当此连接的一些数据还残留在网络中时,当下次连接时会接收到上次遗留下来的数据,因为服务端在发送FIN之前可能会发送一些其他的数据,但并不能保证这些数据一定能够比FIN信号先到达客户端;如果等待2MSL时间,一定能够使这些遗留的数据全部消失,从而不影响同一IP、同一端口的下次连接。
TCP如何保证可靠传输
- 校验:每个TCP头部之前都有一个伪首部
- 序号:每一个TCP包头都有一个序号
- 确认:发送方在一定时间内未收到来自接收方对发送报文的确认信号,则认为发送的报文丢失。
- 重传:在未收到确认一段时间(TCP采用延时确认时间自适应算法,动态改变重传时间RTTs)之后重新传送之前未收到确认的报文。
TCP如何进行流量控制
流量控制思想就是:接收方根据自己的情况动态调整发送方发送数据量的大小。 发送方根据自己接收缓存的大小设置接收窗口大小rwnd,发送方取rwnd和拥塞窗口中的较小值作为发送数据窗口。
TCP如何进行拥塞控制
- 慢启动(启动的时候拥塞窗口指数增长)
- 拥塞避免(大于一定门限后,线性增长,一旦发生网络拥塞,就重新慢启动(TCP Tahoe版本,这个版本已经废弃不用了))
- 快重传
- 快恢复(发生网络拥塞时不是慢启动,而是拥塞窗口减半后,重新拥塞避免)
|