目录
一、为什么要了解TCP/IP
- 网络加载速度是影响编程的重要指标
- HTTP/Websocket是网络请求的基础
- HTTP/Websocket是基于TCP/IP的
二、什么是TCP/IP
TCP/IP(Transmission Control Protocol/Internet Protocol):传输控制协议和网络协议。一般使用TCP/IP代指整个TCP/IP 协议簇。协议簇是啥呢?简单来说就是一系列协议的综合。如下两个图:
这个协议簇其实包含很多其他的协议,但是这里TCP和IP是它们中的代表,不仅仅只有TCP和IP。IP、ICMP、TCP、UDP、TELNET、FTP、HTTP等等都属于TCP/IP协议。
三、TCP/IP协议簇
TCP/IP 协议是程序员接触最多的协议,OSI 模型共有七层,这显然是有些复杂的,所以在 TCP/IP 协议中,它们被简化为了四个层次。如下图所示:
(一)网络接口层
物理层 :物理层是 TCP/IP 的最底层是负责传输的硬件,这种硬件就相当于是以太网或电话线路等物理层的设备。
数据链路层:数据链路层位于物理层和网络层中间,数据链路层定义了在单个链路上如何传输数据。
(二)网络层
网络层:网络层主要使用 IP
协议,IP 协议基于 IP 地址转发分包数据。IP 协议的主要作用就是将分组数据包发送到目标主机。
IP 也是一种分组交换协议,但是 IP 却不具备重发机制。即使数据没有到达另一端也不会进行重发,所以 IP 属于非可靠性协议。 网络层还有一种协议就是 ICMP
,因为 IP 在数据包的发送过程中可能会出现异常,当 IP 数据包因为异常而无法到达目标地址时,需要给发送端发送一个异常通知,ICMP 的主要功能就在于此了。鉴于此情况,ICMP 也可以被用来诊断网络情况。
(三)传输层
传输层就好像高速公路一样,连接两个城市的道路。下面是互联网的逻辑通道,你可以把它想象成为高速公路。传输层最主要的功能就是让应用层的应用程序之间完成通信和数据交换。在计算机内部运行着很多应用程序,每个应用程序都对应一个端口号,我们一般使用端口号来区分这些应用程序。
TCP/IP 中有两个具有代表性的传输层协议,分别是 面向有连接的协议 TCP 和面向无连接的协议 UDP。
3.1 TCP
3.1.1 特点
① TCP 是面向连接的、可靠的流协议。
②每一条TCP连接只能有两个端点(endpoint),点对点
③TCP提供可靠交付的服务,无差错、不丢失、不重复,并且按序到达
④TCP提供全双工通信(双向通信)
⑤面向字节流。‘面向字节流’的含义是:虽然应用程序和TCP的交互是一次一个的数据块,但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。TCP并不知道所传送的字节流的含义
3.1.2 应用
效率要求相对低,但对准确性要求相对高的场景。因为传输中需要对数据确认、重发、排序等操作,相比之下效率没有UDP高。
例如:文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、远程登录。
3.1.3 三次握手(重点)
三次握手流程:
①第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。
②第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
③第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了
三次握手流程图:
为什么需要三次握手?
原因一:
三次是确认对方主机状态以及收发能力的最小次。
客户端给服务端发,如果能收到服务端的ACK,说明服务端的主机状态正常,服务 端的接受能力也正常;
服务端给客户端发,如果能收到客户端的ACK,说明客户端的主机状态正常,客户 端的接受能力也正常。
相反,如果有任意一方即便是经过超时重传也没收到ACK,说明发送ACK的一方可 能主机异常或者不具备接受能力。这说明为了确认双方的状态至少需要三次握手,握手 次数太多只会增加连接成本。
原因二:
降低被攻击的风险的最小次数。
①只有一次握手的后果:客户端的请求服务端照单全收,很可能导致服务器挂掉。
②有两次的后果:收到一个客户端请求后,服务端返回一个ACK,说明连接已建 立。如果服务端接收的请求过多,服务端需要逐一发送ACK,服务器就需要创建 对应的结构体,服务器资源可能会消耗过大,会造成损失。
3.1.3 四次挥手(重点)
四次挥手流程:
①第一次挥手:客户端向服务端发送一个FIN=1的报文,客户端状态变为FIN-WAIT-1,服务端接收到报文,服务端知晓客户端准备关闭连接的事情。
②第二次挥手:服务端发送ACK=1的报文,告知客户端我已知晓,会继续保持,不会马上断开,等待未处理完的请求,此时服务端状态变为CLOSE-WAIT,客户端收到ACK=1的报文,状态变为FIN-WAIT-2。
③第三次挥手:服务端把所有请求处理完后,发送报文FIN=1,服务端状态变为LAST-ACK,告知客户端已传输完成,可以断开连接了,客户端收到FIN报文。
④第四次挥手:客户端向服务端发送响应报文ACK=1,状态变为TIME-WAIT,客户端会等待2MSL,如果期间没有收到服务端的FIN报文,则关闭连接,客户端处于CLOSE状态。当服务端接收到客户端的ACK报文的时候,状态变为CLOSE。
四次挥手图片:
为啥要等待2MSL?
MSL(Maximum Segment Lifetime):一段TCP报文在传输过程中的最大生命周期。
2MSL: 服务器端发出FIN报文和客户端发出ACK确认报文所需的 总时间。
原因:由于服务端在 1MSL 时间内未收到客户端的 ACK报文 后,会重新发送 FIN报文,因此客户端延迟关闭的这2MSL的时间内,如果没有收到FIN包,就证明服务端已经正确接收到客户端发送的 ACK应答报文,因此就可以关闭连接,而如果在这2MSL时间内收到了服务端的 FIN报文,那么就代表发送的 ACK报文 丢失了,需要重新发送,通过这种延迟2MSL的方式可以完全保证双方都可以安全地关闭连接
3.2 UDP
3.2.1 特点
①面向报文,不具有可靠性。
②UDP 不提供复杂的控制机制,利用 IP 提供面向无连接的通信服务。
③传输途中出现丢包,UDP 也不负责重发。
④当包的到达顺序出现乱序时,UDP没有纠正的功能
⑤出现网络拥堵的情况,UDP 无法进行流量控制等避免网络拥塞行为
3.2.2 应用
①包总量较少的通信(DNS、SNMP等)
②视频、音频等多媒体通信(即时通信)
③限定于 LAN 等特定网络中的应用通信
④广播通信(广播、多播)
3.3 TCP和UDP对比
区别:
应用:
(四)应用层
在 TCP/IP 协议簇中,将 OSI 标准模型中的会话层、表示层都归为了应用层。应用层的架构大多属于客户端/服务端模型,提供服务的程序叫做服务端、接受服务的程序叫做客户端。在这种架构中,服务端通常会提前部署到服务器上,等待客户端的连接,从而提供服务。
四、数据处理流程。
下面以用户A向用户B发送图示来说明: