zoukankan      html  css  js  c++  java
  • TCP/IP协议详解

    一、一些基本的常识

    在学习协议之前,我们应该具备一些基本知识。


    IP地址

    网络上每一个节点都必须有一个独立的 Internet 地址(也叫做IP地址)。现在,通常使用的IP地址是一个 32bit 的数字,也就是我们常说的 IPv4 标准,这 32bit 的数字分成四组,也就是常见的 255.255.255.255 的样式。IPv4 标准上,地址被分为五类,我们亚洲使用的是B类地址,具体的分类请参考其他文档。需要注意的是IP地址是 网络号+主机号 的组合,这非常重要。


    域名系统

    12 个阿拉伯数字很难记忆。使用一个名称更容易。用于 TCP/IP 地址的名字被称为域名。w3school.com.cn 就是一个域名,当你键入一个像 http://www.w3school.com.cn这样的域名,域名会被 DNS 程序翻译为数字。

    在全世界,数量庞大的 DNS 服务器被连入因特网。DNS 服务器负责将域名翻译为 TCP/IP 地址,同时负责使用新的域名信息更新彼此的系统。

    当一个新的域名连同其 TCP/IP 地址一同注册后,全世界的 DNS 服务器都会对此信息进行更新。域名系统是一个分布的数据库,它提供将主机名(就是网址啦)转换成IP地址的服务。


    端口号(port)

    注意,这个号码是用在 TCP,UDP 上的一个逻辑号码,并不是一个硬件端口,我们平时说把某某端口封掉了,也只是在IP层次把带有这个号码的IP包给过滤掉了而已。


    二、为什么会有TCP/IP协议?

    在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。计算机使用者意识到,计算机只是单兵作战并不会发挥太大的作用。只有把它们联合起来,电脑才会发挥出它最大的潜力,于是人们就想方设法的把电脑连接到了一起。

    但是简单的连到一起是远远不够的,就好像语言不同的两个人互相见了面,完全不能交流信息。因而他们需要定义一些共通的东西来进行交流,TCP/IP 就是为此而生。TCP/IP 指传输控制协议/网际协议 (Transmission Control Protocol / Internet Protocol),定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。但TCP/IP 不只是一个协议,而是一个协议族的统称。在 TCP/IP 中包含一系列用于处理数据通信的协议:

    • TCP (传输控制协议) - 应用程序之间通信
    • UDP (用户数据包协议) - 应用程序之间的简单通信
    • IP (网际协议) - 计算机之间的通信
    • ICMP (因特网消息控制协议) - 针对错误和状态
    • DHCP (动态主机配置协议) - 针对动态寻址

    电脑有了这些协议,就好像学会了外语一样,就可以和其他的计算机终端做自由的交流了。


    三、TCP/IP协议分层


    TCP/IP 协议的开发始于20世纪60年代后期,早于 OSI参考模型,故不甚符合 OSI 参考标准。大致来说,TCP/IP 的应用层大体上对应着 OSl 模型的应用层、表示层和会话层,TCP/IP 的网络接口层对应着 OSI 数据链路层和物理层,而传输层和网络层在两个模型中对应得很好。

    虽然OSI参考模型是计算机网络协议的标准,但由于其开销太大,所以真正采用它的情况并不多。TCP/IP协议则不然,由于它的简洁、实用,从而得到了广泛的应用。可以说,TCP/IP协议已成为建立计算机局域网、广域网的首选协议,已成为事实上的工业标准和国际标准。

    TCP/IP网络协议栈分为四层, 从上至下依次是:

    • 应用层

      应用层负责处理特定的应用程序细节。几乎各种不同的 TCP/IP 实现都会提供下面这些通用的应用程序:Telnet远程登录、SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)、FTP(File Transfer Protocol,文件传输协议)、HTTP(Hyper Text Transfer Protocol,超文本传输协议)等。

    • 传输层

      传输层主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)。

    • 网络层

      网络层处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(Internet Protocol,网际协议)、ICMP协议(Internet Control Message Protocol,网际控制报文协议)和IGMP协议(Internet Group Management Protocol,网际组管理协议)。

    • 网络接口层

      链路层有时也称作链路层或数据链路层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆的物理接口细节。把链路层地址和网络层地址联系起来的协议有ARP(Address Resolution Protocol,地址解析协议)和RARP(Reverse Address Resolution Protocol,逆地址解析协议)。


    四、TCP/IP

    TCP/IP 意味着 TCP 和 IP 在一起协同工作。

    TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信。

    IP 负责计算机之间的通信。

    TCP 负责将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。

    IP 负责将包发送至接受者。


    五、UDP协议

    UDP(User Datagram Protocol,用户数据报协议),是一个简单的面向数据报的传输层协议,在TCP/IP模型中,UDP为网络层以上和应用层以下提供了一个简单的接口。UDP只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,不保留数据备份。


    UDP报文结构:


    UDP套接口是无连接的、不可靠的数据报协议;既然他不可靠为什么还要用呢?其一:当应用程序使用广播或多播时只能使用UDP协议;其二:由于他是无连接的,发送数据之前不需要建立连接(TCP需要),所以速度快。因为UDP套接口是无连接的,如果一方的数据报丢失,那另一方将无限等待,解决办法是设置一个超时。

    • 面向报文,对IP数据报只做简单封装(8字节UDP报头)。减少报头开销。

    • 没有阻塞机制,宁愿阻塞时丢弃数据不传,也不阻塞造成延时。

    • UDP支持一对一、一对多、多对一、多对多通信。

    UDP协议包括:TFTP(简单文件传输协议)、SNMP(简单网络管理协议)、DNS(域名解析协议)、NFS、BOOTP。


    六、TCP协议

    6.1 TCP介绍

    TCP(Transmission Control Protocol,传输控制协议)相对于UDP,TCP是面向连接的、提供可靠的数据传输服务。同时也是较UDP开销较大的、传输速度较慢的。


    区别:

    UDP:单个数据报,不用建立连接,简单,不可靠,会丢包,会乱序;

    TCP:流式,需要建立连接,复杂,可靠 ,有序。


    TCP报文结构:


    TCP提供可靠的、面向连接的数据传输服务。使用TCP通信之前,需要进行 “三次握手 建立连接,通信结束后还要使用 “四次挥手” 断开连接。

    • TCP是点对点的连接。一条TCP连接只能连接两个端点。
    • TCP 提供可靠传输,无差错、不丢失、不重复、按顺序。
    • TCP 提供全双工通信,允许通信双方任何时候都能发送数据,发送方设有发送缓存,接收方设有接收缓存。
    • TCP 面向字节流 。TCP 并不知道所传输的数据的含义,仅把数据看作一连串的字节序列,它也不保证接收方收到的数据块和发送方发出的数据块具有大小对应关系。

    TCP的协议包括:FTP(文件传输协议)、Telnet(远程登录协议)、SMTP(简单邮件传输协议)、POP3(和SMTP相对,用于接收邮件)、HTTP协议等。


    6.2 TCP三次握手

    所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:


    注:

    • seq:(Sequence Number):本报文段数据的第一个字节的序号

    • ack:(Acknowledgment Number):确认号——期望收到对方下个报文段的第一个数据字节的序号

    • SYN(synchronize):请求同步标志——用于建立和释放连接,当 SYN=1 时,表示建立连接。

    • ACK(acknowledge):确认标志——仅当 ACK=1时确认号字段才有效。建立 TCP 连接后,所有报文段都必须把 ACK 字段置为 1。


    三次握手流程

    (1)第一次握手:Client 将标志位 SYN 置为 1,随机产生一个值 seq=J,并将该数据包发送给 Server,Client 进入 SYN_SENT 状态,等待 Server 确认。

    (2)第二次握手:Server 收到数据包后由标志位 SYN=1 知道 Client 请求建立连接,Server 将标志位 SYN 和 ACK 都置为 1,ack=J+1,随机产生一个值 seq=K,并将该数据包发送给 Client 以确认连接请求,Server 进入 SYN_RCVD 状态。

    (3)第三次握手:Client 收到确认后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将标志位 ACK 置为 1,ack=K+1,并将该数据包发送给 Server,Server 检查 ack 是否为 K+1,ACK 是否为 1,如果正确则连接建立成功,Client 和 Server 进入 ESTABLISHED 状态,完成三次握手,随后 Client 与 Server 之间可以开始传输数据了。


    简单来说,就是

    1、建立连接时,客户端发送 SYN 包(SYN=i)到服务器,并进入到 SYN-SEND 状态,等待服务器确认。

    2、服务器收到 SYN 包,必须确认客户的 SYN(ack=i+1),同时自己也发送一个 SYN 包(SYN=k),即 SYN+ACK 包,此时服务器进入 SYN-RECV 状态

    3、客户端收到服务器的 SYN+ACK 包,向服务器发送确认报 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手,客户端与服务器开始传送数据。


    为什么要三次握手?

    握手的过程实际上是在通知对方自己的初始化序号(Initial Sequence Number),简称ISN,也就是上图中的 J 和 K。J 和 K 会被当作之后传输数据的一个依据,以保证 TCP 报文在传输过程中不会混乱。

    解决两个问题:

    1、避免连接请求的数据包丢失

    假设连接途中,客户端网络不稳定出现丢包,服务端根据 seq=J 来确定客户端请求到第几个包。然后告诉客户端你从第 seq=J 个包开始发送给我,之前的不用发送了,我这里有记录了。

    2、数据传输过程因为网络并发量很大在某结点被阻塞

    传输过程因为网络并发量很大在某结点被阻塞了,Server端将先后收到2次请求,并持续等待两个Client请求向他发送数据,但是Cient端实际上只有一次请求,而Server端却有2个响应,极端的情况可能由于Client端多次重新发送请求数据而导致Server端最后建立了N多个响应在等待,因而造成极大的资源浪费!

    三次握手的seq与ack确定了包的顺序。客户端每次请求时,询问服务端说这是第一号包,服务端收到后告诉客服端下次你给我的只能是二号包(别的都不要),同时给返回到客户端的包作标记:这是我返回给你的一号包。这样,出现阻塞时,根据包的序号就知道要响应的是几号包。


    6.3 TCP四次挥手

    所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:


    注:由于 TCP 连接是全双工的,因此需要双向关闭。


    四次挥手流程

    (1)第一次挥手:Client 发送一个 FIN,用来关闭 Client 到 Server 的数据传送,Client 进入 FIN_WAIT_1 状态。

    (2)第二次挥手:Server 收到 FIN 后,发送一个 ACK 给 Client,确认序号为收到序号+1(与 SYN 相同,一个 FIN 占用一个序号),Server 进入 CLOSE_WAIT 状态。

    (3)第三次挥手:Server 发送一个 FIN,用来关闭 Server 到 Client 的数据传送,Server 进入 LAST_ACK 状态。

    (4)第四次挥手:Client 收到 FIN 后,Client 进入 TIME_WAIT 状态,接着发送一个 ACK 给 Server,确认序号为收到序号+1,Server 进入 CLOSED 状态,完成四次挥手。


    参考:

    百度百科 - TCP/IP协议

    TCP协议详解

    TCP/IP协议族


  • 相关阅读:
    Docker windows 安装MySql和Tomcat
    Python2 Python3 爬取赶集网租房信息,带源码分析
    BeautifulSoup 一行代码获取今日日期,与smtplib结合
    Python3.x 发送邮件
    Python3 pymysql连接mysql数据库 windows
    urllib2.HTTPError: HTTP Error 403: Forbidden的解决方案
    BeautifulSoup([your markup]) to this: BeautifulSoup([your markup], "lxml") 解决未设置默认解析器的错误
    Python 3.x 中"HTTP Error 403: Forbidden"问题的解决方案
    继承习题
    继承
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/11351792.html
Copyright © 2011-2022 走看看