转载自:简书-王南北
深入浅出了解TCP/IP协议
在当今互联网世界,上网已经不再是什么稀罕事,动动手指就能够通过互联网做到很多以前做不到的事情,但是作为一名互联网从业的开发人员,网络协议依然是必须知道的基础知识。
那么网络协议究竟是什么意思呢?
其实网络协议,就是为了所有的计算机能够在同一个网络中互相传递数据,而制定的数据传输规则。 就好像我们只有说同一种语言才能互相交流一个道理,那么想要在互联网中传递数据,就得遵守标准的网络协议。
OSI参考模型
既然说到网络协议就像一种语言,同语言间才能够互相交流,那么自然网络协议也像语言一样,是多种多样的。
在这种情况下国际标准化组织
(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架,简称OSI,OSI模型,即开放式通信系统互联参考模型(Open System Interconnection,OSI/RM,Open Systems Interconnection Reference Model)。
这个模型的目的是:提供给开发者一个必须的、通用的概念以便开发完善、可以用来解释连接不同系统的框架。也就是说希望规范网络协议。
OSI模型定义了网络互联的七层框架,也就是将网络协议从软件到硬件,从上到下的分成了七层,每层都为更高一层提供服务。
虽然说OSI模型算是网络协议的框架标准,但是在实际的使用中,TCP/IP的五层协议使用的更加广泛。
TCP/IP
TCP/IP指的其实不只是TCP和IP这两个协议,而是一个协议簇,其中包括了IP、ICMP、TCP、http、ftp、pop3 等等的一系列协议。 TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议和网络协议的简称,它定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。
TCP/IP是Internet互联网上所有主机间的共同协议。
结构
而TCP/IP协议采用五层结构,其与OSI模型的各层对应关系为
各层作用
物理层和数据链路层
物理层是定义物理介质的各种特性:
- 机械特性
- 电子特性
- 功能特性
- 规程特性
数据链路层是负责接收IP数据包并通过网络发送,或者从网络上接收物理帧,抽出IP数据包,交给IP层。
- ARP是正向地址解析协议,通过已知的IP,寻找对应主机的MAC地址。
- RARP是反向地址解析协议,通过MAC地址确定IP地址。比如无盘工作站还有DHCP服务。
常见的接口层协议有:
Ethernet 802.3、Token Ring 802.5、X.25、Frame relay、HDLC、PPP ATM等。
网络层
负责相邻计算机之间的通信。其功能包括三方面。
- 处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。
- 处理输入数据报:首先检查其合法性,然后进行寻径–假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。
- 处理路径、流控、拥塞等问题。
网络层包括:IP(Internet Protocol)协议、ICMP(Internet Control Message Protocol)
控制报文协议、ARP(Address Resolution Protocol)地址转换协议、RARP(Reverse ARP)反向地址转换协议。
- IP是网络层的核心,通过路由选择将下一条IP封装后交给接口层。IP数据报是无连接服务。
- ICMP是网络层的补充,可以回送报文。用来检测网络是否通畅。Ping命令就是发送ICMP的echo包,通过回送的echo relay进行网络测试。
传输层
提供应用程序间的通信。其功能包括:一、格式化信息流;二、提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送,即耳熟能详的“三次握手”过程,从而提供可靠的数据传输。
传输层协议主要是:传输控制协议TCP(Transmission Control Protocol)和用户数据报协议UDP(User Datagram protocol)。
应用层
向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。远程登录TELNET使用TELNET协议提供在网络其它主机上注册的接口。TELNET会话提供了基于字符的虚拟终端。文件传输访问FTP使用FTP协议来提供网络内机器间的文件拷贝功能。
应用层协议主要包括如下几个:FTP、TELNET、DNS、SMTP、NFS、HTTP。
- FTP(File Transfer Protocol)是文件传输协议,一般上传下载用FTP服务,数据端口是20H,控制端口是21H。
- Telnet服务是用户远程登录服务,使用23H端口,使用明码传送,保密性差、简单方便。
- DNS(Domain Name Service)是域名解析服务,提供域名到IP地址之间的转换,使用端口53。
- SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,用来控制信件的发送、中转,使用端口25。
- NFS(Network File System)是网络文件系统,用于网络中不同主机间的文件共享。
- HTTP(Hypertext Transfer Protocol)是超文本传输协议,用于实现互联网中的WWW服务,使用端口80。
TCP
TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
在TCP/IP协议簇中,TCP处于传输层中。
应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。
TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK),如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和。
TCP报文头
TCP传输的数据分为头部和数据部分。
各个段位说明:
- 源端口和目的端口: 各占 2 字节.端口是传输层与应用层的服务接口.传输层的复用和分用功能都要通过端口才能实现
- 序号: 占 4 字节.TCP 连接中传送的数据流中的每一个字节都编上一个序号.序号字段的值则指的是本报文段所发送的数据的第一个字节的序号
- 确认号: 占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号
- 数据偏移/首部长度: 占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远.“数据偏移”的单位是 32 位字(以 4 字节为计算单位)
- 保留: 占 6 位,保留为今后使用,但目前应置为 0
- 紧急URG: 当 URG=1 时,表明紧急指针字段有效.它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
- 确认ACK: 只有当 ACK=1 时确认号字段才有效.当 ACK=0 时,确认号无效
- PSH(PuSH): 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付
- RST (ReSeT): 当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接
- 同步 SYN: 同步 SYN = 1 表示这是一个连接请求或连接接受报文
- 终止 FIN: 用来释放一个连接.FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接
- 检验和: 占 2 字节.检验和字段检验的范围包括首部和数据这两部分.在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部
- 紧急指针: 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)
- 选项: 长度可变.TCP 最初只规定了一种选项,即最大报文段长度 MSS.MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节.” [MSS(Maximum Segment Size)是 TCP 报文段中的数据字段的最大长度.数据字段加上 TCP 首部才等于整个的 TCP 报文段]
- 填充: 这是为了使整个首部长度是 4 字节的整数倍
- 其他选项:
- 窗口扩大: 占 3 字节,其中有一个字节表示移位值 S.新的窗口值等于TCP 首部中的窗口位数增大到(16 + S),相当于把窗口值向左移动 S 位后获得实际的窗口大小
- 时间戳: 占10 字节,其中最主要的字段时间戳值字段(4字节)和时间戳回送回答字段(4字节)
- 选择确认: 接收方收到了和前面的字节流不连续的两2字节.如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方,使发送方不要再重复发送这些已收到的数据
三次握手四次挥手
既然说到TCP,不能不提到广为人知的三次握手和四次挥手,TCP协议为了保证信息传输的连接和可靠性,使用了这样的方式来保证连接的可靠性。
三次握手
所谓三次握手,其实指的是TCP建立连接的过程,整个建立连接的过程需要发送三个包,来确认建立连接,具体流程如下:
- 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
- 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
- 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
四次挥手
四次挥手指的则是断开连接的过程:
- 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
- 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
- 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
- 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
转载请注明:Seven的博客