1.TCP/IP四层模型
# 1.网络接口层(物理层,数据链路层) # 2.网络层 # 3.传输层 # 4.应用层(会话层,表示层,应用层)
2.TCP与UDP区别
# TCP:面向连接,可靠的,速度慢,效率低 # UDP:无连接,不可靠,速度快,效率低
3.TCP/UDP应用
# TCP
对通信质量有要求的,例如HTTP,HTTPS协议 # UDP
不需要一对一沟通,建立连接的,可以做到一对多,如广播,直播
需要处理速度快的,能容忍丢包的
4.三次握手四次挥手
# 三次握手
# 1.客户端发送一个带SYN标志的TCP报文到服务器端,并进入SYN_SEND状态,等待服务端确认 # 2.服务端收到客户端的报文并返回一个同时带ACK标志和SYN报纸的报文,进入SYN_RECV状态。表示确认刚才客户端的报文,同时询问客户端是否准备好通讯 # 3.客户端再次回应服务端一个ACK报文,双方进入ESTABILISHED状态
# 四次挥手 # 1.TCP客户端发送一个FIN,用来关闭客户端到服务端的数据传送 # 2.服务端收到这个FIN,它发挥一个ACK,确认序号为收到的序号加一 # 3.服务端关闭客户端的连接,发送一个FIN给客户端 # 4.客户端发回ACK报文确认,并将确认序号设置为收到序号加一
5.为什么连接的时候是三次握手,关闭的时候是四次挥手?
# 因为服务端收到客户端的SYN连接请求报文后,可以把ACK和SYN(ACK起应答作用,SYN起同步作用)放在一个报文里发送。但关闭连接时,当收到对方的FIN报文时,它仅仅表示对方没有数据发送给你了,但为你所有的数据都全部发送给对方了,所以你未必会马上关闭SOCKET,也就是说你可能还需要发送一下数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以这里的ACK和FIN多数情况下都是分开发送的。
6.为什么不能TIME_WAIT状态还需要等待2MSL后才能返回到CLOSED状态?
# 虽然4个报文都发送完毕,按理可以直接进入CLOSED状态。但是,假设网络是不可靠的,最后一个ACK可能会丢失,所以TIME_WAIT状态就是用来重发丢失的ACK。此时处于LAST_ACK的SOCKET会因超时未收到ACK,而重发FIN报文,直接接收到ACK才结束TCP连接。 # 等待2MSL:2MSL是一个发送和一个回复所需的最大时间,Client进入TIME_WAIT状态会设置一个计时器,等待2MSL,如果直到2MSL,Client没有再收到FIN,那么Client推断ACK已被成功接收,关闭连接。
7.为什么不能用两次握手?
# 客户端和服务端通信,假定客户端给服务端发送一个连接请求,服务端收到后返回ack应答,按照两次握手,服务端认为连接已经成功建立,并开始发送数据.假设网络是不可靠的,客户端没有收到服务端的ack应答,客户端认为还未建立连接,将忽略服务端发来的所有数据,只等待服务端的ack应答,造成死锁
8.如果已经建立了连接,但是客户端发生故障?
# TCP设有一个保活计时器,如果一端长时间未收到任何数据,则会每隔一段时间发送探测报文,若一连发送10个报文仍没反应,则认为对方发生故障,关闭连接
9.为什么说TCP是可靠的?
# 首先TCP是面向连接的,客户端发送一段数据都需要服务端确认 # 1.序列号 TCP在传输过程中,对每一个字节都进行了编号,确保数据按序到达 # 2.超时重传 当客户端给服务端发送数据,由于网络等原因,数据包没有到达服务端,或者服务端的响应数据包没有在超时重传时间内到达客户端,会重新发送数据 # 3.流量控制 TCP窗口会指明双方能够发送和接收的最大数据量 # 4.拥塞控制 慢启动 拥塞避免 拥塞解决 快速恢复