一.简单说明
最近面试,面试官喜欢问TCP/IP协议相关的内容,先前也未对此概念性的东西有过系统的梳理。这里针对这块知识盲点进行了学习。简单来说:
TCP/IP是指利用IP进行通信时所用到的协议群的统称。具体来说,IP或ICMP、TCP或UDP、TELNET或FTP、以及HTTP等都属于TCP/IP协议。
二.具体介绍
2.1 TCP/IP协议概念
TCP/IP协议(TCP/IP Protocol Suite)是互联网通信的基础框架,它采用分层结构,规定了数据如何封装、寻址、传输、路由和接收。为实现这些功能,TCP/IP协议包含了几十种网络协议,构成了一个协议群。
2.2 计算机网络体系结构分层
OSI的七层模型包含:
1.应用层:主要的协议有HTTP、FTP。应用层是开放系统的最高层,是直接为应用进程提供服务的。其作用就是在实现多个系统应用进程相互通信的同时,完成一系列业务处理所需的服务。
2.表示层:没有协议。表示层实现数据格式化、代码转换、数据加密。简单来说就是win系统想给QQ发短信给linux的QQ的规范标准,表示层会通过使用一种通格式来实现多种数据格式之间的转换。
3.会话层:没有协议。会话层实现解除或建立与别的结点的联系。
4.传输层:主要的协议有TCP和UDP。TCP将数据封装成用户数据报或者说是报文,然后分段传输。UDP将数据封装成用户数据报直接传输。传输层向它上面的应用层提供端到端通信服务。它属于面向通信部分的最高层,同时也是用户功能中的最低层。传输层对收到的报文进行差错检测。
5.网络层:主要的协议有IP,主要是将报文封装成IP数据报。
6.数据链路层:IP数据堡封装成帧,传给物理层。
7.物理层:主要是将比特或者说是0和1转化为强弱电流,然后到接受方再将强弱电流转化为01。这里主要定义光纤、网线的接口。
OSI七层模型 | TCP/IP概念层模型 | 功能 | TCP/IP协议族 |
---|---|---|---|
应用层 | 应用层 | 文件传输、电子邮件、文件服务、虚拟终端 | TFTP、HTTP、SNMP、FTP、DNS、TELNET |
表示层 | 应用层 | 数据格式化、代码转换、数据加密 | 没有协议 |
会话层 | 应用层 | 解除或建立别的接点的联系 | 没有协议 |
传输层 | 传输层 | 提供端对端的接口 | TCP、UDP |
网络层 | 网络层 | 为数据包选择路由 | IP、ICMP、RIP、OSPF、BGP |
数据链路层 | 链路层 | 传输有地址的帧以及错误检测功能 | SLIP、CSLIP、PPP、ARP、RARP、MTU |
物理层 | 链路层 | 以二进制数据形式在物理媒体上传输数据 | ISO2110、IEEE802、IEEE802.2 |
三.重点介绍
3.1 传输层中的TCP和UDP
TCP/IP中有两个具有代表性的传输层协议,分别是TCP和UDP:
- TCP是面向连接的、可靠的流协议。流就是指不间断的数据结构,当应用程序采用TCP发送信息时,虽然可以保证发送的顺序,但还是像没有任何间隔的数据流发送给接收端。TCP为提供可靠性传输,实行“顺序控制”或“重发控制”机制。此外还具备“流控制(流量控制)”、“拥塞控制”、提高网络利用率等众多功能。
- UDP是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在UDP的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。
TCP和UDP的区别:
1.TCP是面向连接(如打电话需要先拨号建立连接),UDP是无连接的,即发送数据之前不需要建立连接。
2.TCP提供可靠的服务。UDP尽最大努力交付,但不保证可靠交付。也就是说通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达,TCP通过校验和,重传控制,序号标识,滑动窗口、确认应答等机制实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
3.UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
5.TCP对系统资源要求较多,UDP对系统资源要求较少。
3.2 三次握手
-
TCP提供面向有连接的通信传输。面向有连接是指在数据通信开始之前,先做好两端之间的准备工作。
-
所谓三次握手是指建立一个TCP连接时需要客户端和服务端共发送三个包以确认连接的建立。在socket编程中,这一过程由客户端执行connet来触发。
下面看看三次握手的流程图:
-
第一次握手:客户端将标志位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状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
3.3 四次挥手
- 四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
- 由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
下面来看看四次挥手的流程图:
中断连接端可以是客户端,也可以是服务器端。
- 第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
- 第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
- 第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
- 第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。
参考链接如下:
https://developer.51cto.com/art/201906/597961.htm
http://c.biancheng.net/view/6376.html