文章目录
-
-
- OSI“实现”:TCP/IP
- TCP三次握手
- 为什么需要三次握手才能建立起连接
- 首次握手的隐患---SYN超时
- 建立连接后,客户端出现故障怎么办
- TCP的四次挥手
- 为什么会有TIME_WAIT状态
- 为什么需要四次挥手才能断开连接
- 服务器出现大量CLOSE_WAIT状态的原因
- TCP特点
- UDP特点
- TCP和UDP的区别
- HTTP主要特点
- 请你说一下HTTP的报文段是什么样的?(请求报文和响应报文)
- GET方式和POST方式的区别
- 请你回答一下HTTP用的什么连接?
- HTTP请求/响应的步骤
- 在浏览器地址栏键入URL,按下回车之后经历的流程
- HTTP和HTTPS的区别
- HTTPS真的很安全么
- 接口和端口的区别
- IPv4与IPv6
-
OSI“实现”:TCP/IP
OSI模型注重通信协议必要的功能是什么,而TCP/IP则更强调在计算机上实现协议应该开发哪种程序。
TCP三次握手
- URG:紧急指针标志
- ACK:确认序号标志
为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段,上面的确认号是否有效就是通过该标识位控制的 - PSH:push标志
- RST:重置连接标志
- SYN:同步序号,用于建立连接过程
在连接请求中,SYN = 1 与 ACK = 0 表示该数据段没有使用捎带的确认阈,而连接应答捎带一个确认即 SYN = 1 ,ACK = 1 - FIN:用于释放连接
为1时表示发送方已经没有数据发送了,即关闭奔放数据流。
“握手”是为了建立连接,而连接的目的是形成虚拟电路
简要阐述:
详细阐述:
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
-
最开始,客户端与服务器都处于CLOSED的状态。假设主动打开连接的是客户端,被动打开连接的是服务器,刚开始的时候TCP服务器进程先创建传输控制块TCB,时刻准备接收其他客户进程发送过来的连接请求,此时服务器进入LISTEN即监听状态,这时客户端也是先创建一个传输控制块TCB,然后向服务器发出连接请求报文,SYN = 1,同时选择一个初始序号seq = x,这个x可以是一个任意的正整数值,此时TCP客户端进程进入了SYN-SENT 同步已发送状态,此时发送过去的数据包即报文段会被称为SYN报文段,它是不能携带数据的,但是要消耗掉一个序号,这便是第一次握手。
-
当服务器接收到请求报文后,如果同意连接,则发出确认报文。确认报文中包含了ACK = 1和SYN = 1,确认号就是x+1(原因是在之前的SYN报文中指定了sequence number = x,作为回应,回应跟x相关的信息,并且由于上面的报文消耗掉了一个序号,因此它就成为x+1),同时也要为自己的缓存初始化一个序列号即seq = y,此时服务器进入到了SYN-RCVD 同步收到状态,这个报文也是不能携带数据的,并且同样需要消耗一个序号,这便是第二次握手。
-
当TCP客户进程收到确认报文之后,还要向服务器给出一个确认,确认报文的ACK = 1,小的ack = y+1(原因是因为服务器刚刚发了seq= y,同时该报文也要消耗一个序号,作为回应就给了y+1),同时先前告知了序号被+1了,因此这里seq = x+1,此时TCP连接建立,客户端就进入了ESRABLISHED已建立连接状态,而TCP规定这个报文段可以携带数据,前两个都是不可以携带的,当然它也可以不携带,如果不携带数据就不会消耗序号,这便是第三次握手。当服务器收到客户端的确认后也会进入ESRABLISHED的状态,此后双方就可以开始通信了。
为什么需要三次握手才能建立起连接
主要是为了初始化Sequence Number
的初始值。通信的双方要互相通知对方自己初始化的Sequence Number
,也就是x,y,这个号要作为以后数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输问题而乱序,即TCP会用这个序号来拼接数据。因此,在服务器回发它的Sequence Number
即第二次握手之后还需要发送确认报文给服务器,告知服务器说客户端已经收到你的初始化的Sequence Number
了。
首次握手的隐患—SYN超时
如果服务器接收到了客户端发送的SYN后,回复SYN-ACK,回复后客户端就掉线了,此时服务器就没有收到客户端发送回来的ACK包的确认,那么这个链接就会处于一个中间状态,既没有成功也没有失败,于是服务器如果在一定时间内没有收到客户端的回执,那么它就会重发SYN-ACK,在Linux下默认重试次数为5次,重试的间隔时间从1秒开始,每次都翻倍,也就是1,2,4,8,16,总共31秒,在第5次发出去后还需要等待32秒才能够被判定为超时,所以共需63秒