浅谈HTTP(简) TCP协议
Posted Adorable_Rocy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈HTTP(简) TCP协议相关的知识,希望对你有一定的参考价值。
前言:HTTP请求是依赖TCP协议的,当我们掌握HTTP请求流程之后,应当掌握TCP中究竟发生了什么,做了什么事情?
补充:TCP把连接作为最基本的对象,每一条TCP连接都有两个端点,这种断点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字,例如,若IP地址为192.168.1.1 而端口号为80,那么得到的套接字为192.168.1.1:80。
1.三次握手
- TCP服务器创建 TCB 传输控制块,服务器进入监听(Listener)状态。
- 首先由 Client 端向服务器端发送SYN = 1 ,seq = a(序列号) , 发出连接请求报文,此时,TCP 客户端进程进入了 SYN-SENT(同步已发送状态) 状态 。SYN报文段,不能携带数据,但需要消耗掉一个序号
- Server 端收到 Client 端发送的请求后,确认报文中应该 ACK=1,SYN=1,确认号是ack=a+1,同时也要为自己初始化一个序列号 seq = b, 携带数据为【ACK=1,SYN=1,ack=a+1,seq=b】,同时,Server 端 进入 SYN-RCVD(同步收到) 状态【这个报文也不能携带数据,但是同样要消耗一个序号】
- Client 端收到来自 Server 端的确认后,会向 Server 端发送 ACK=1,ack=b+1,自己的序列号seq=a+1 确认收到 ,此时 Client 端进入 ESTABLISHED(已建立连接) 状态。【ACK报文段可以携带数据,但是如果不携带数据则不消耗序号】
- Server 端 收到 Client 端数据后 , 也会进入 ESTABLISHED(已建立连接) 状态。
- 这个过程即完成三次握手
如下图所示:
拓展:如果在三次握手中发生了丢包,又会是一个怎样的机制呢?使用一个简单的例子模拟为什么需要三次握手
- 打电话的场景
- 电话接通…
- A:你好啊,能听到我说话吗?
- B:你好,能听到你说话
- A:我也可以听得到你说话
- 开始交谈…
这个过程其实很好理解,A在向B确认自己的传输通信是否正常,B向A反馈A是否正常,最后A向B反馈B是否正常,当这几个过程都正常之后,才能建立起连接
问题:如果中途发生丢包行为了怎么办?
- 打电话的场景
- 电话接通…
- A:你好啊,能听到我说话吗?
- B:你好,能听到你说话
- …
- B:喂?你还在吗?能听到我说话吗?
- …
- B看到这么久无人回应,于是挂断电话…
如对话中B行为所示,在收不到对方回应时,会重新发送丢失的包,并且收到对方的反馈才算确认完成,如果B(长时间)未得到回应,自然就会挂掉电话(断开连接)。
2.四次挥手
加深印象:模拟课堂结束的过程
- 叮叮叮
- 下课铃已经响起来了,让我们把镜头推到C32班
- 班长:王老师,下课铃响了,我们应该下课了
- 王老师:我知道,等我把这道题讲完
- …
- 王老师:好了,这道题讲完了,同学们下课
- 全班同学(起立):老师再见,谢谢老师
- 直到看到王老师走出教室才坐下
- …
挥手的过程如图所示:
过程解析:
- Client 端主动发起关闭请求,发送 FIN 到 Server 端 , 此时,Client 端进入 FIN-WAIT-1(等待终止1) 状态
- Server 端收到后,发送 ack 返回给 Client 端 , 此时 Server 端进入 CLOSE-WAIT(关闭等待) 状态
- TCP服务器通知高层的应用进程,Client 端向 Server 器的方向就释放了,这时候处于半关闭状态,即Client 端已经没有数据要发送了,但是 Server 端若发送数据,Client 端依然要接受。此时,客户端进入 FIN-WAIT-2(等待终止2) 状态。
- Server 端数据传输完之后 , 发送 FIN 到 Client 端 ,此时 Server 端 进入 LAST-ACK(等待确认关闭) 状态
- Client 端收到 Server 端的FIN ,返回 ack 给 Server 端 ,此时 Client 端进入 TIME-WAIT(等待2MSL) 状态,Client 端会进入等待区 (2MSL)两倍的交互时间,为的是确保 Server 端收到 Client 端的ack 。
- Server 端 收到 Client 端的 确认, 进入 CLOSED 状态 , 撤销TCB , 结束TCP连接,即完成四次挥手。
以上是关于浅谈HTTP(简) TCP协议的主要内容,如果未能解决你的问题,请参考以下文章