网络协议模型
网络中的网络协议模型共有两种:一种是网络标准OSI/ISO
七层协议模型,一种是使用广泛TCP/IP
五层协议模型。上图就是OSI/IOS
七层协议模型。其实这两种都差不多,TCP/IP
五层协议模型是把OSI/IOS
七层模型的上三层合并成为了应用层。
数据在网络上的传输过程
在网络传输上共有两个角色:客户端和服务端。客户端发送请求,服务端响应请求。网络请求在网络协议模型上是一个拆包和封包的过程。
过程如下:
- 数据发送端每经过一层都会封装上这层协议的协议头部向下传输。例如:对于网络请求来说,在应用层封装上HTTP的头部转换成报文,在传输层封装上TCP头部转换成数据包,在网络层封装上IP的头部转化成IP数据报,在数据链路层加上MAC地址封装成帧,然后在物理层转换成比特流进行传输。
- 在物理层传输过程中如果遇到交换机和路由器。遇到交换机把比特流转换成帧,根据交换机所指MAC地址重新封装成帧再向下转换进行传输;遇到路由器拆包到网络层,根据路由策略决定向下传的IP地址再进行向下封装传输。
- 经过万里长征终于到达服务器,会在网络协议模型中把第一步骤一一拆解开,最终拿到数据。响应过程中还是这么一套过程。
数据通信的三种基本方式
写到这心里一凉,慌的拿起我的计算机网络书看了看....
单向通信
单向通信又称单工通信,即只能有一个方向的通信而没有反方向的交互。比如:无线电广播、电视广播这种。
双向交替通信
双向交替通信又称半双工通信,即通信的双方都可以发送信息,但不能同时发送(当然也不能同时接收)。这种通信方式是一方发送另一方只能接受,等发送的一方不发了,接收的一方才可以发送。比如:对讲机等。
双向同时通信
双向同时通信又称全双工通信,即通信的双方都可以同时发送和接受信息。显然,双向通信的传输效率最高。TCP就是全双工通信。
说了这么多(其实也不多),主要还是要聊聊传输层TCP协议。
TCP
TCP协议的特点
- TCP是面向连接的传输层协议
- 每一条TCP协议只能有两个端口
- TCP提供数据的可靠交付服务
- TCP是全双工通信
- 面向字节流
TCP头部
TCP头部共有20字节的数据,如下图:
- 0-4:我们都知道TCP协议是保证端到端可靠传输,首先是4个字节的目的端口和源端口
- 4-8:Sequence Number (发包的顺序号)
- 8-12:Acknowledgment Number (应答号,不同的应答号代表者不同的指令,标记此次动作)
- 12-16:标记位,偏移量,时间窗口等等
- 16-20:Checksum(校验码)、Urgent Pointer(偏移指针)
- TCP Options TCP内置的命令(FIN,SYN就在这里)。
- 上层数据
socket套接字
上面说到TCP的特点的时候说道每一条TCP只能有两个端口,这端口不是别的,就是套接字端口。
套接字接口的格式:
socket = {IP地址 : 端口号}
三次握手、四次挥手
为什么三次握手、四次挥手?
TCP保证的是应用程序之间端到端的可靠传输。要想可靠就必须要有这个机制。
三次握手
先来张好玩的图 三次握手总结如下:
- 客户端对服务端说:Hi,你能收到我发的信息吗?
- 服务器对客户端说:我能收到,你能收到我发的吗?
- 客户端对服务器说:我也能收到。
是不是非常好理解,再来个详细。
- 开始的时候客户端和服务器的TCP连接都处于CLOSE状态。当要连接的时候,客户端为主动打开,服务端为被动打开。
- 一开始服务端服务器进程首先创建传输控制模块TCB(这其中保存了连接重要的信息),然后服务端就处于LISTEN状态。
- 客户端向服务器发送一个SYN=1,seq=n(SYN=1,建立连接的标志,seq为头部的序号位)的数据包,此时客户端进入SYN_SENT状态(连接请求已发送)。
- 服务端接收到客户端发来的请求时,会向客户端发送确认并且请求客户端建立连接(SYN=1、ACK=1、seq=k,ack=n+1),此时服务端进入SYN_RCVD状态(连接请求收到)
- 客户端接收到服务器的确认后,并且还要向服务器发送确认,(ACK=1,seq=n+1,ack=k+1),此时TCP建立连接,客户端状态变为EXTABLISHED(已连接状态)
- 服务端接受到客户端的确认之后,同样也进入EXTABLISHED(已连接状态)。三次握手完毕
四次挥手
在此次聊天过程中,突然双方起了争执。
四次挥手总结如下:
- 客户端对服务端说:我不想听你说话了,不和你聊了(此时客户端已经把手机扔一边了)。
- 服务端对客户端说:你不想听,我也要说(服务端直男癌犯了,服务端说啥客户端都看不到)。
- 服务端对客户端说:我也不想和你说话了,冷战吧。
- 客户端对服务端说:好,冷战就冷战,然后双方删了微信。
- 开始处于数据传输过程中,双方状态为ESTABLISHED。
- 首先客户端向服务端发送FIN=1,seq=x(FIN=1是断开连接的标志)的数据包,进入FIN_WAIT1状态(终止等待1)。
- 服务端接受到客户端的请求,因为服务端这边还要收场,所以先应答客户端,进入CLOSE_WAIT状态(关闭等待)。此时TCP通信就进入到了半关闭状态。
- 客户端接收到服务端返回的确定进入FIN_WAIT2状态(终止等待2).
- 服务端处理好自己的事情之后,向客户端发送一个FIN=1的包,进入LAST_ACK(最后确认)状态。
- 客户端接收到服务端发送的关闭连接的包,并返回个服务端确认。进入TIME_WAIT(时间等待)状态,此时TCP连接还没有释放点,必须要经过时间等待计数器设置的时间之后(2MSL),才会进入CLOSED(关闭)状态。
- 服务端接受到客户端的确认之后,进入CLOSED(关闭)状态。
- 客户端时间等待计数器结束之后进入CLOSED(关闭)状态。TCP连接释放。
Over!