TCP/IP协议讲解

一.简单说明

最近面试,面试官喜欢问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

原文地址:https://www.cnblogs.com/yuhaohao/p/13176857.html