一、什么是TCP/IP
TCP/IP是一个协议族,是因为TCP/IP协议包括TCP、IP、UDP、ICMP、RIP、TELNETFTP、SMTP、ARP、TFTP等许多协议,这些协议一起称为TCP/IP协议。通信类似于语言的沟通,可以把协议理解为语言沟通,大家都说中文,咱们两个人能够互相交流。
TCP/IP协议族按照层次分为链路层、网络层、传输层、应用层四个层次。(与TCP/IP协议并列的还有OSI网络框架模型---开放式系统互连参考模型,分为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层七个层次)
为了更加形象的说明协议,可以把“数据链路层”比作一个人,但是这个人不会说话,交流起来比较困难。为了更方便的交流,便引出了“网络层”,可以认为它是会说话的人,那么大家都会说话,但是一个人说英语一个人说中文,大家还是不能够更好的沟通。那么接下来大家该讨论下如何沟通,必须大家都要说中文,这样大家才能理解彼此说的是什么意思,“传输层”就可以认为会说中文的人。这样在传输层大家就能实现正常的通信了。为了大家更方便的沟通,或者说让沟通看起来更加华丽更加实用。这时候“应用层”便应运而生。其实就是更方便,更有效大家沟通,可以把它比作为中文说的很好的人。
按照层次由上到下,层层包装。
1、应用层:最上面的就是应用层了,这里面有http,ftp等等我们熟悉的协议。(TCP/IP的分层中,将OSI参考模型中的会话层、表示层和应用层的功能都集中到了应用程序中实现。TCP/IP应用的架构绝大多数属于客户端/服务器模型。)
负责直接和应用程序接口并提供常见的网络应用服务,此外,为了向应用程序提供有效的网络服务,应用层还需要确立相互通信的应用进程的有效性并提供双方之间的同步,需要提供应用进程所需的信息交换和远程操作,需要建立错误恢复的机制以保证应用层数据的一致性。(有FTP协议、TFTP协议、Telnet协议、DNS协议、HTTP协议)。
向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。远程登录TELNET使用TELNET协议提供在网络其它主机上注册的接口。TELNET会话提供了基于字符的虚拟终端。文件传输访问FTP使用FTP协议来提供网络内机器间的文件拷贝功能。
DNS协议:主要功能是通过用户友好的名称为用户提供域名解析服务,即将主机名域名解析为IP地址。
HTTP协议:超文本传输协议,是一种详细规定了浏览器和万维网服务器之间互相通信的规则。
SMTP协议:Simple Mail Transfer Protocol(简单邮件传输协议)。
SNMP协议:Simple Network manage Protocol(简单网络管理协议)。
FTP协议:File Transfer Protocol(文件传输协议)。
应用层的主要应用:
WWW:浏览器和服务端之间通信所用的协议是HTTP协议,所传输数据的主要格式为HTML,WWW中的HTTP属于OSI应用层的协议,HTML属于表示层的协议。
电子邮件:发送电子邮件时用到的协议是SMTP。最初,只能以文件格式发送电子邮件。然后现在的电子邮件的格式由MIME协议扩展之后,就可以发送声音、图像等各式各样的信息。MIME属于表示层的协议。
文件传输(FTP):文件传输是指将其它计算机磁盘上的文件转移到本地计算机上,或将本地磁盘上的文件传送到其它计算机磁盘上。该文件传输过程使用的协议叫做FTP协议。在FTP中进行文件传输时会建立两个TCP连接,分别是发送传输请求时所要用到的控制连接与实际传输数据时所要用到的数据连接。
远程登录(TELNET与SSH):远程登录是指登录到远程的计算机上,使那台计算机上的程序得以运行的一种功能。远程登录常用TELNET与SSH两种协议。(当然还有其它一些协议)
网络管理(SNMP):在TCP/IP中进行网络管理时,采用SNMP(Simple Network Management Protocol)协议。使用SNMP协议管理的主机、网桥、路由器等称作SNMP代理,而进行管理的那一端叫做管理器。SNMP就是这个管理器和代理要用到的协议。在SNMP的代理端,保存着网络接口的信息、通信数据量、异常数据量以及设备温度等信息。这些信息可以通过MIB(Management Information Base)访问。因此,在TCP/IP的网络管理中,SNMP属于应用协议,MIB属于表示层协议。
2、传输层:著名的TCP和UDP协议就在这个层次(不要告诉我你没用过UDP玩星际)。
提供应用程序间的通信。其功能包括:
(1)格式化信息流;
(2)提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送。
UDP协议(User Datagram Protocol,用户数据报协议)是一种不可靠无连接的传输层协议,不考虑流控制、错误控制,没有重传机制,不会对分组进行顺序检查和排序。(UDP报头含8字节定长和2字节倍数的数据<不是2字节倍数时需要填充位>)(UDP是一种面向无连接的传输层协议。UDP不关心对端是否真正收到了传送过去的数据。如果需要检查对端是否收到分组数据包,或者对端是否连接到网络,则需要在应用程序中实现。UDP常用在分组数据较少或多播、广播通信以及视频通信等多媒体领域。)
TCP协议(Transport Control Protocol,传输控制协议)是一种面向连接、可靠的、基于字节流的传输层协议,采用了确认机制、超时重传机制,还会对接收到的TCP报文段进行重新排列整理。(TCP报头含20字节定长、选项和填充<选项和填充小于等于40字节>)(TCP是一种面向连接的传输层协议。它可以保证两端通信主机之间的通信可达。TCP能够正确处理传输过程中丢包、传输顺序乱掉等异常情况。)
UDP优点:
控制选项少,无须建立连接,从而使得数据传输过程中的延迟小、数据传输效率高。
UDP适合对可靠性不高,或网络质量有保障,或对实时性要求较高的应用程序。
TCP优点:
能保证可靠性、稳定性。
TCP适合用于端到端的通信,适用于对可靠性要求较高的服务。
3、网络层:用来处理网络上流动的数据包(网络传输中最小的数据单元),规定了怎样的路径把数据包传输到目标计算机,并把数据包传送给对方。(与tcp/ip协议密切相关的有IP协议、ARP协议、RARP协议)。IP协议就在这里,它负责对数据加上IP地址和其他的数据(后面会讲到)以确定传输的目标。
负责相邻计算机之间的通信。其功能包括三方面。
(1)处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。
(2)处理输入数据报:首先检查其合法性,然后进行寻径--假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。
(3)处理路径、流控、拥塞等问题。
IP协议:Internetworking Protocol(网间网协议),IP是跨越网络传送数据包,使整个互联网都能收到数据的协议。IP也是分组交换的一种协议,但是它不具备重发机制,因此它是不可靠传输协议。
IPv4:头部由20字节定长和一个可选的变长部分(小于等于40字节)组成,32位记录源端IP地址,32位记录目的端IP地址,所有内容长度最大为2^16=65476字节。
IPv6:头部由40字节定长组成。128位记录源端IP地址,128位记录目的端IP地址。
ARP协议:地址解析协议,专用于将32位IP地址映射到网卡的48位MAC地址(从分组数据包的IP地址中解析出物理地址(MAC地址)的一种协议。)。
RARP协议:主要用于将网卡的48位MAC地址转换为32位IP地址。
ICMP协议:Internet Control Message Protocol(互联网控制信息协议),IP数据包在传输的途中一旦发生异常导致无法到达目的地址时,需要给发送端发送一个异常通知。ICMP就是为了这个功能制定的。
4、链路层:用来处理连接网络的硬件部分,包括控制操作系统、硬件的设备驱动和网络适配器,及光纤等物理可见的部分。硬件上的范畴均属于链路层的作用范围之内。
TCP/IP软件的最底层,负责接收IP数据报并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报,交给IP层。
这个层次为待传送的数据加入一个以太网协议头,并进行CRC编码,为最后的数据传输做准备。再往下则是硬件层次了,负责网络的传输,这个层次的定义包括网线的制式,网卡的定义等等(这些我们就不用关心了,我们也不做网卡),所以有些书并不把这个层次放在tcp/ip协议族里面,因为它几乎和tcp/ip协议的编写者没有任何的关系。
发送协议的主机从上自下将数据按照协议封装,而接收数据的主机则按照协议从得到的数据包解开,最后拿到需要的数据。这种结构非常有栈的味道,所以某些文章也把tcp/ip协议族称为tcp/ip协议栈。
通俗理解:
二、以HTTP协议为例的工作流程
与之密切相关的协议有IP/TCP/DNS
DNS解析主机名域名为IP地址后,IP通过ARP解析后找到目的主机,TCP则通过三次握手与目的主机建立连接。
连接后,若一方想主动取消连接,TCP通过四次挥手与主动主机取消连接。
1、TCP连接建立的三次握手过程:
(前提:A主动打开,B被动打开。客户端用A表示,服务器端用B表示)
- 客户端发个请求“开门呐,我要进来”给服务器;
- 服务器发个“进来吧,我去给你开门”给客户端;
- 客户端有很客气的发个“谢谢,我要进来了”给服务器。
2、TCP连接释放的四次挥手过程
(前提:A主动关闭,B被动关闭。客户端用A表示,服务器端用B表示)
- 客户端发个“时间不早了,我要走了”给服务器,等服务器起身送他;
- 服务器听到了,发个“我知道了,那我送你出门吧”给客户端,等客户端走;
- 服务器把门关上后,发个“我关门了”给客户端,然后等客户端走(尼玛~矫情啊);
- 客户端发个“我知道了,我走了”,之后自己就走了。