一、网络模型

计算机网络的两种模型:OSI 模型和 TCP/IP 模型

由于 OSI 模型过于复杂难以实现,导致 TCP/IP 模型更早地应用在现实中,这也使得 TCP/IP 模型成为标准

在 OSI 模型中,将计算机网络分成了 7 层,而在 TCP/IP 模型中则分成了 4 层,其各层对应关系如下表所示:

OSI TCP/IP 对应网络协议 所在位置
应用层 应用层 TFTP, FTP, NFS, WAIS 主机
表示层 Telnet, Rlogin, SNMP, Gopher
会话层 SMTP, DNS
传输层 传输层 TCP, UDP
网络层 网际层 IP, ICMP, ARP, RARP, AKP, UUCP 媒介
数据链路层 网络接口层 FDDI, Ethernet, Arpanet, PDN, SLIP, PPP
物理层 IEEE 802.1A, IEEE 802.2到IEEE 802.11

> 网卡的实现

物理层与数据链路层的功能

> HTTP 与 HTTPS

在 Internet 中所有的传输都是通过 TCP/IP 进行的。

HTTP 协议作为 TCP/IP 模型中应用层的协议也不例外,HTTP 协议通常承载于 TCP 协议之上,有时也承载于 TLS 或 SSL 协议层之上,这个时候,就成了我们常说的 HTTPS

HTTP 默认的端口号为 80,HTTPS 的端口号为 443

二、UDP与TCP协议

在整个计算机网络体系中,最核心的当属是位于传输层的 TCP 与 UDP 协议了。因为他们位于主机协议栈的最底层,向上方应用层提供不同的数据交付方式。

1、UDP 协议

> 什么是 UDP 协议:

UDP 全称用户数据报协议(User Datagram Protocal),它有以下几个值得注意的特点:

  1. UDP 不能保证可靠传输,也就更不能保证所发送的数据的到达顺序,它所实现的是尽最大的努力交付。

  2. UDP 是面向数据报文的、无连接的协议,因此它的开销低并且发送器前的时延小(因为不用建立连接啊),面向报文也使得 IP 层在传输 UDP 协议的报文时既不会拆分也不会合并。

  3. UDP 可以支持一对一、一对多、多对一、多对多的通信。

  4. UDP 没有拥塞控制功能,它的发送速率不会随着网络出现的拥塞而降低,所以它的实时性较好。这也是许多视频聊天应用采用它的原因。

> UDP 报文头部格式:

其中从 1 到 8 字节分别是来源端口号、目的端口号、报文长度、检验和,每个字段各占两字节。

UDP 的通信方式较为简单,发送端发送完一个报文继续发送下一个,待将所有报文发送完毕通信就结束了。

接收方也是如此。

2、TCP 协议

> 什么是 TCP 协议:

TCP 全称传输控制协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP 协议所要实现的功能是端到端之间的可靠传输,因此,相较于 UDP 协议而言,TCP 协议要复杂的多。

相对于 UDP 协议,TCP 协议有下面的几个特点:

  1. TCP 协议保证可靠传输,也就是说发送的数据是什么样,接收的数据也是什么样。

  2. TCP 协议是有连接的、面向数据流的协议。有连接是说数据传送前通信双方需要建立连接、通信完毕后需要断开连接,不过这里所提到的连接都是逻辑上的连接。面向数据流的意思是说发送方应用程序发送的数据是什么顺序,接收方应用读取的接收到的数据也是什么顺序。

  3. TCP 协议提供的是端到端的通信,也就是说一条TCP连接只能提供一对一的通信。不过,一个应用可以同时建立多条 TCP 连接来实现与多个目标的通信。

  4. TCP 协议提供拥塞控制功能,会在网络状况良好的情况下适当提高发送/接收速率,反之则适当降低发送/接收速率。这样,将会提高对网络的利用率。

此外,还需要注意的是,TCP 提供的是全双工的通信。

> TCP 数据封包的结构示意:

各个字段功能如下:

来源端口(2字节):标识来源端口号

目的端口(2字节):标识目的端口号

序列号码(4字节):表明此封包在字节流中的顺序号(因为 TCP 是面向字节流的协议,需要保证最终的数据顺序与发送方发送的顺序一致,所以需要这个字段来表明该封包在字节流中的位置)

确认号码(4字节):对此前按顺序收到的最后一个封包的序列号码的确认(确认号 =n,表示 n-1 及其之前的封包都已经收到)

报头长度(1字节):指示报文头部的长度

保留字段(10位):暂时没打算好干啥用,一律置 0

标识符(6位):

  • URG—为 1 表示高优先级数据包,紧急指针字段有效
  • ACK—为 1 表示确认号字段有效。TCP 规定连接建立后,所有传送的报文段都必须把该字段置为 1
  • PSH—为 1 表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满
  • RST—为 1 表示出现严重差错。可能需要重现创建 TCP 连接。还可以用于拒绝非法的报文段和拒绝连接请求
  • SYN—为 1 表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步
  • FIN—为 1 表示发送方没有数据要传输了,要求释放连接

窗口(2字节):表示从确认号开始,本报文的源方可以接收的字节数,即源方接收窗口大小。用于流量控制

校验和(2字节)对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。这是一个强制性的字段

紧急指针(2字节):本报文段中的紧急数据的最后一个字节的序号

选项字段(最多40字节):每个选项的开始是 1 字节的 kind 字段,说明选项的类型

> 超时重传

为了搞明白下面要说的 TCP 的一些机制,首先需要知道 TCP 协议能够实现可靠传输的一个基本的原理--超时重传。

说来很简单,其实就是收到当接收方收到一个数据封包的时候就向发送方发送一个确认数据封包。而当发送方发送完一个数据封包经过一段时间没有收到接收方的确认封包时,就会将上一个封包再次向接收方发送一次。

当然,TCP 中真正的机制比这个要复杂的多,但是基于的原理都是一样的。

> TCP 三次握手

在说 TCP 连接之前先插播一个小故事。

有一天,小明到店里去买笔,于是跟老板有了以下对话:

小明:我要一支笔。
老板:你确定要一支笔?
小明:我确定要一支笔!

于是老板就给了小明一支笔……

这就是典型的 TCP 连接建立的过程。如下面的图:

ACK 表示 TCP 包头中的确认标识

  1. (我要一支笔。)客户端向服务器发送建立连接请求数据包,其中包头内容 SYN=1,seq=x(自己随机选的起始序号)

  2. (你确定要一支笔?)服务器收到请求后,如果同意建立连接,就向客户端发送同意建立连接请求数据封包,其包头内容 SYN=1,ACK=1,ack=x+1 (seq=y(同样也是自己随机挑选的)

  3. (我确定要一支笔!)客户端收到服务器发来的确认请求后,也向服务器发送确认封包,其内容 ACK=1,ack=y+1(原理同上),seq=x+1(毕竟已经发送过 seq=x 的封包了),随后客户端就进入连接建立状态,而服务器就在收到这个确认封包后也进入连接建立状态

以上步骤就是俗称的“TCP 三次握手”

> TCP 四次挥手

当然,有连接建立,就有连接释放,客户端与服务器之间的连接释放过程大概是下面这个样子的

跟建立连接的时候差不多,大概过程大概向下面这样:

  1. 客户端向服务器发送连接请求释放封包,封包内容为 FIN=1,seq=u

  2. 服务器收到后,决定要跟客户端释放连接,可是还有数据没传送完啊,就先发一个封包告诉客户端我可以释放连接,你可以不用向我发送数据了,可是我还有数据没有传送完,所以在我告诉你结束之前你得一直接收我的数据(别忘了,TCP 可是全双工的)。所以所发送封包内容为:ACK=1,ack=u+1,seq=v(FIN=0表示我还有数据要发送)

  3. 服务器发送完数据后,告诉客户端我都发送完了,可以结束了。于是发送封包为 FIN=1,ACK=1,ack=u+1,seq=w(中间还传输过数据,所以可能不是 v+1)

  4. 客户端收到服务器的确认后,再次向服务器发送确认,内容是 ACK=1,ack=w+1,seq=u+1

  5. 发送完上面的确认封包后,客户端再等一段时间(2MSL)后,就断开连接。至此,连接正常释放

如上步骤就是俗称的“TCP 4次挥手”。

这里之所以是 4 次,主要是与建立连接时相比,服务器的确认和结束被分成了两个封包分别发送了出去

三、总结

1、传输层提供端到端的可靠报文传递和错误恢复

2、网卡实现的是物理层与数据链路层的功能

3、HTTP 的端口号是 80;HTTPS 的端口号是 443

4、UDP 注重数据传输快,TCP 注重数据可靠性

5、域名系统 DNS 采用的是 UDP,而非 TCP

关于TCP/IP的更多相关文章

  1. TCP/IP基础

    TCP/IP 是用于因特网 (Internet) 的通信协议. 计算机通信协议是对那些计算机必须遵守以便彼此通信的规则的描述. 什么是 TCP/IP? TCP/IP 是供已连接因特网的计算机进行通信的 ...

  2. TCP/IP之TCP_NODELAY与TCP_CORK

    TCP/IP之Nagle算法与40ms延迟提到了Nagle 算法.这样虽然提高了网络吞吐量,但是实时性却降低了,在一些交互性很强的应用程序来说是不允许的,使用TCP_NODELAY选项可以禁止Nagl ...

  3. 《图解TCP/IP》读书笔记

    一.国际惯例:书托 这是一本图文并茂的网络管理技术书籍,旨在让广大读者理解TCP/IP的基本知识.掌握TCP/IP的基本技能. 书中讲解了网络基础知识.TCP/IP基础知识.数据链路.IP协议.IP协 ...

  4. Atitit osi tcp ip 对应attilax总结

    Atitit osi tcp ip 对应attilax总结 Atitit 网络摄像机又叫IP CAMERA(简称IPC)常见的协议组合 网络摄像机又叫IP CAMERA(简称IPC)由网络编码模块和模 ...

  5. 门面模式的典型应用 Socket 和 Http(post,get)、TCP/IP 协议的关系总结

    门面模式的一个典型应用:Socket 套接字(Socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息: 连接使用的 ...

  6. OSI七层模型详解 TCP/IP协议

      总结 OSI中的层 功能 TCP/IP协议族 应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 表示层 数据格式化,代码转 ...

  7. 一种面向对象的TCP/IP中间件

    这是一个使用C++封装的TCP/IP协议栈(仅传输层),属于本人所设计的中间件的一员,具有硬件无关,应用无关特性,使用非常方便,一看代码便知: #include "net.h" / ...

  8. TCP/IP协议(二)tcp/ip基础知识

    今天凌晨时候看书,突然想到一个问题:怎样做到持续学习?然后得出这样一个结论:放弃不必要的社交,控制欲望,克服懒惰... 然后又有了新的问题:学习效率时高时低,状态不好怎么解决?这也是我最近在思考的问题 ...

  9. TCP/IP协议(一)网络基础知识

    参考书籍为<图解tcp/ip>-第五版.这篇随笔,主要内容还是TCP/IP所必备的基础知识,包括计算机与网络发展的历史及标准化过程(简述).OSI参考模型.网络概念的本质.网络构建的设备等 ...

  10. TCP/IP中链路层的附加数据(Trailer数据)和作用

    1.TCP/IP中链路层的附加数据是什么 在用wireshark打开报文时,链路层显示的Trailer数据就是附加数据,如图 2.如何产生 1.例如以太网自动对小于64字节大小的报文进行填充(未实验) ...

随机推荐

  1. 深入理解 JavaScript 中的 class

    在 ES6 规范中,引入了 class 的概念.使得 JS 开发者终于告别了,直接使用原型对象模仿面向对象中的类和类继承时代. 但是JS 中并没有一个真正的 class 原始类型, class 仅仅只 ...

  2. Sql Server 数据库出现“可疑”的解决办法

    问题:数据库名称出现“可疑”字样 解决: 方法一: 重新还原数据库 方法二: 贴上语句:(DB_CS:你的数据库名) 第一步: ALTER DATABASE DB_CS SET EMERGENCY 第 ...

  3. JavaScript如何实现日期的前一天后一天转变

    1.生成时间 var data =new Date(); 2.获得时间戳     什么是时间戳? 时间戳是指格林威治时间自1970年1月1日(00:00:00 GTM)至当前时间的总秒数.它也被称为U ...

  4. linux lnmp环境下 安装apache教程

    linux lnmp环境下 安装apache教程 源码安装 apr ,apr-util 安装apache要用<pre>wget http://mirrors.cnnic.cn/apache ...

  5. [转帖]美团在Redis上踩过的一些坑-5.redis cluster遇到的一些问题

    美团在Redis上踩过的一些坑-5.redis cluster遇到的一些问题 博客分类: redis 运维 redis clustercluster-node-timeoutfailover  转载请 ...

  6. ImageView基本用法

    1.background通常指的都是背景,而src指的是内容. 2.当使用src填入图片时,是按照图片大小直接填充,并不会进行拉伸. 3.scaleType缩放类型设置: fitXY:对图像的横向与纵 ...

  7. Java自学-类和对象 类属性

    Java的类属性和对象属性 当一个属性被static修饰的时候,就叫做类属性,又叫做静态属性 当一个属性被声明成类属性,那么所有的对象,都共享一个值 与对象属性对比: 不同对象的 对象属性 的值都可能 ...

  8. Java 加载动态库 dll 文件

    不知道具体原理,但是,加载 dll 文件时,带路径或者更改 dll 文件的名字,都会报错.虽然库记载成功了,但是处女座认为这不可接受.于是有了这个解决方案. 在根目录为库创建软连接,然后使用 syst ...

  9. Linux(二)各种实用命令

    继续Linux命令学习,没有什么捷径,每个命令都去敲几遍就熟悉了,第二篇学习的是一些比较实用类的命令,主要是从开发的角度进行学习,并不深入,话不多说,开始! 一.系统管理类 1.1 stat --st ...

  10. LINUX 下.NET Core 微服务部署实战

    前言 最近一直在开发部署.也没有总结一下.从5月份开始出差到现在基本没有发过博客,哎,惭愧. 一直在弄微服务,后续会慢慢更新下面这个系列.欢迎各位大佬交流指点. 分布式理论专题 1..net core ...