TCP/IP协议图解
联网的各个终端之间能否进行交互的软件基础是网络协议栈,目前主流的网络协议栈是TCP/IP协议栈。




1、主机到网络层协议:以太网协议
主机到网络层主要为IP协议和ARP协议提供服务、发送和接收网络数据报。本层中由于要实现跨网和跨设备的互通,有很多的实现方式,这里我们只关注以太网的实现方式。
以太网是由数字设备公司(Digital Equipment Corp,DEC)、英特尔公司和Xerox公司在1982年公布的一个标准。目前TCP/IP技术主要基于以太网标准。以太网标准采用一种带冲突检测的载波监听多路接入(CSMA/CD,Carrier Sense,Multiple Access with Collision Detection)的方法进行传输。以太网的封包格式如下图所示,它在IP数据的基础上增加了共14个字节。

源地址和目的地址:以太网用48bits(6字节)来表示源地址和目的地址。这里的源地址和目的地址指的是硬件地址,例如网卡的MAC地址。
在地址后面是两个字节的表示类型的字段,例如0800表示此帧数据为IP数据,0806表示此帧数据为ARP请求。
类型字段之后是数据,对于以太网,规定数据段的大小范围是46-1500个字节,如果数据不足46个字节,则要用空字符填满。
注意:数据段的长度有一个最大值,以太网为1500,这个特性称为MTU,即最大传输单元。如果IP层有一个要求传送的数据长度比MTU大,那么在IP层要对数据进行分片,使得每个片都小于MTU。
CRC字段用于对帧内数据进行校验,以保证数据的正确性,通常由硬件实现(例如在网卡设备中实现)。
注意:以太网的头部长度为14的特点在某些平台的实现上会造成效率上的问题,例如4字节对齐的平台,在取得IP数据时通常会重新复制一次。
2、IP协议
IP协议是TCP/IP协议中最重要的协议,它为TCP、UDP、ICMP等协议提供传输的通路。IP层的主要目的是提供子网的互联,形成较大的网络,使不同的子网间能够传输数据。IP层主要有如下作用:

IP数据的格式如下图所示,不包含选项字段,其头部长度为20字节。

源IP地址和目的IP地址:源地址表示发送数据的主机或设备的IP地址,目的地址表示接收数据的主机IP地址。这两个字段均为32位。本字段的目的在于识别Internet上的主机。
3、网际控制报文协议(ICMP)
ICMP协议用于传递差错信息、时间、回显、网络信息等报文控制数据。
ICMP协议的数据位于IP字段的数据部分,它是在IP报文的内部被传送的。

ICMP报文的数据格式如下图所示:

ICMP的报文类型由类型和代码两个字段共同决定。
4、传输控制协议(TCP)
传输控制协议(Transmission Control Protocol),简称TCP协议,它在原有IP协议的基础上,增加了确认重发、滑动窗口和复用/解复用等机制,提供一种可靠的、面向连接的、字节流服务。
首先,TCP提供客户和服务器的连接。
其次,TCP提供可靠性。(数据的可靠投递或故障的可靠通知)并不能保证数据一定会被对方端点接收。
第三,TCP通过给所发送数据的每一个字节关联一个序列号进行排序(sequencing)。
第四,TCP提供流量控制(flow control)。TCP总是告诉对端它能够接收多少字节的数据,这称为通告窗口(advertised window)。该窗口在任何时刻都指出接收缓冲区中的可用空间,从而确保发送端发送的数据不会溢出接收缓冲区。该窗口时时刻刻动态地变化着:当接收来自发送端的数据时,窗口大小减小;而当接收端应用进程从缓冲区中读取数据时,窗口大小增大。
最后,TCP的连接是全双工的(full duplex)。
TCP的特点:

TCP的数据格式:


源端口号和目的端口号:这两个字段均为16位的长度,表示发送端和接收端的端口,用于确认发送端和接收端的应用程序。发送端的IP地址和端口号以及接收端的IP地址和端口号可以确认一个在Internet上的TCP连接。

TCP的封装解封过程:

建立TCP连接的三次握手:
(1)服务器必须准备好接受外来的连接。这通过调用socket、bind和listen函数来完成,称为被动打开(passive open)。
(2)客户通过调用connect进行主动打开(active open)。这引起客户TCP发送一个SYN(表示 同步)分节(segment),它告诉服务器客户将在(待建立的)连接中发送数据的初始序列号。一般情况下SYN分节不携带数据,它只含一个IP头部、一个TCP头部及可能有的TCP选项。
(3)服务器必须确认客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器以单个分节向客户发送SYN和对客户SYN的ACK(表示确认)。
(4)客户必须确认服务器的SYN。
连接建立的过程至少需要交换三个分组,因此称之为TCP的三路握手(three-way handshake)。如下图所示:

上图中给出的客户的初始序列号为J,而服务器的初始序列号为K。在ACK里的确认号为发送这个ACK的一端所期待的对端的下一个序列号。
建立TCP连接的日常系统可类比电话系统,客户(呼叫者)、服务器(被呼叫者):
soket函数等同于有电话可用。呼叫者和被呼叫者都要有一个电话。
bind函数用于告诉其他人你的电话号码,让他们可以向你打电话。
listen函数用于打开电话振铃,它使得你可以听到一个外来的电话。
accept函数等同于被呼叫者接电话,而且accept函数有来电显示功能,可以显示呼叫者的电话号码。
释放TCP连接的四次握手:

TCP状态转换图:
TCP连接的建立和终止可以用状态转换图(state transition diagram)来说明。

TCP为一个连接定义了11种状态(nestat命令的输出包括这些状态,它是调试客户/服务器应用程序有用的工具),并且TCP规则规定如何基于当前状态及在该状态下接收的分节从一个状态转换到另一个状态。
我们用实线表示客户的状态转换,虚线表示服务器的状态转换。

注意,执行主动关闭的那一端(客户端)进入TIME_WAIT状态。该端点停留在这种状态的持续时间是最长分节生命期(maximum segment lifetime,简称MSL)的两倍,有时候称之为2MSL。
5、用户数据报文协议(UDP)
UDP是一种基于IP协议的无连接、不可靠网络传输协议。

UDP协议把应用程序需要传递的数据发送出去,不提供发送数据包的顺序;接收方不向发送方发送接收的确认信息,如果 出现丢包或者重包的现象,也不会向发送方发送反馈,因此不能保证使用UDP协议的程序发送的数据一定到达了接收方或者到达接收方的数据顺序和发送方的一致性。
使用UDP协议传输数据的应用程序,必须自己构建发送数据的顺序机制和发送接收的确认机制,以此来保证发送数据的正确到达,保证接收数据的顺序与发送数据的一致性,也就是说应用程序必须根据UDP的缺点提供解决方案。
UDP协议相对于TCP协议执行时的速度要比TCP快得多,因为UDP协议简单的多,对系统造成的负载低。
UDP的数据格式:

源端口号和目的端口号分别是一个16位的字段,用来表示发送方和接收方的UDP端口。
UDP数据的传输过程:

每个UDP数据报都有一个长度。如果数据报正确地到达其最终目的地,那么数据报的长度将随数据一道传送给接收端应用程序。而TCP是一个字节流(byte stream)协议,没有任何记录边界。
TCP/IP协议图解的更多相关文章
- TCP/IP协议 (图解+秒懂+史上最全)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- TCP/IP协议(一)网络基础知识
参考书籍为<图解tcp/ip>-第五版.这篇随笔,主要内容还是TCP/IP所必备的基础知识,包括计算机与网络发展的历史及标准化过程(简述).OSI参考模型.网络概念的本质.网络构建的设备等 ...
- HTTP协议—— 简单认识TCP/IP协议
大学没读计算机专业,所以很多的专业知识都不知道.既然已经从事了IT这个行业,就势必要去了解下网络底层,虽然实际工作中这些东西用不到.高楼大厦,起于平川.不积跬步,无以至千里,不积小流,无以成江海.我现 ...
- JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo
OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七 ...
- 服务器编程入门(1)TCP/IP协议族
问题聚焦: 简单地梳理一下TCP/IP各层的功能和常用协议 详细了解ARP(数据链路层)和DNS(应用层)协议的工作原理 1 TCP/IP协议族体系结构 数据链路层: 职责:实现网卡接口的网络 ...
- TCP/IP协议族(一) HTTP简介、请求方法与响应状态码
接下来想系统的回顾一下TCP/IP协议族的相关东西,当然这些东西大部分是在大学的时候学过的,但是那句话,基础的东西还是要不时的回顾回顾的.接下来的几篇博客都是关于TCP/IP协议族的,本篇博客就先简单 ...
- TCP/IP协议精华笔记
1.简介 TCP/IP协议并非单指TCP协议.IP协议,它是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议.ICMP(Internet Control Mes ...
- Linux 高性能服务器编程——TCP/IP协议族
1 TCP/IP协议族体系结构 数据链路层: 职责:实现网卡接口的网络驱动程序,一处理数据在物理媒介(如以太网.令牌环等)上的传输. 常用协议:ARP协议(地址解析协议),RARP协议 ...
- 一文让你秒懂互联网TCP/IP协议的深层含义
什么是 TCP/IP 协议 首先,协议,可以理解为是一套统一的规则,就像行业标准.由于互联网主要的功能是传输信息,所以其协议一般是管理系统之间如何相互通信的规则. 用邮政和物流等线下的“运输协议”来理 ...
随机推荐
- python接口测试之日志功能
之前在简书中看了一篇关于日志功能的文档,供大家参考:https://www.jianshu.com/p/62f7b49b41e7 Python通过logging模块提供日志功能,所以直接导入即可 im ...
- spring boot:shardingsphere+druid多数据源整合seata分布式事务(spring boot 2.3.3)
一,为什么要给shardingsphere配置多数据源? 1,shardingjdbc默认接管了所有的数据源, 如果我们有多个非分表的库时,则最多只能设置一个为默认数据库, 其他的非分表数据库不能访问 ...
- laravel job 队列
1.数据库建表 php artisan queue:table<span> </span>//队列任务表 php artisan queue:failed-table<s ...
- spring-boot-route(十九)spring-boot-admin监控服务
SpringBootAdmin不是Spring官方提供的模块,它包含了Client和Server两部分.server部分提供了用户管理界面,client即为被监控的服务.client需要注册到serv ...
- Jenkins部署分支报Finished: UNSTABLE的问题解决
近期将代码分支部署到Jenkins上时报Finished: UNSTABLE,检查服务器无报错日志.怀疑是磁盘空间不足所致. 首先,在服务器上输入df -lh 查看本地磁盘使用情况,发现空间几乎被用完 ...
- Mybatis初学经验----------------(2)
至于myBatis的配置,上篇文章中有,就不说了.今天谈谈myBatis编写Dao层时的用法. 传统Dao层代码需求 1.在Dao层实现类中,存在大量的模板方法,能否提取模板方法,减少我们的工作量. ...
- 4G DTU和4G工业路由器有哪些区别?
DTU的英文全称是Data Transfer unit,是一种专门用来将将IP数据转换为串口数据或者是将串口数据转换为IP数据并且通过无线通信网络将数据进行传送的无线终端设备.DTU也可以实现无线网络 ...
- python实现有趣的数学逻辑程序
1.无重复数字的三位数 题目:有1.2.3.4个数字, 能组成多少个互不相同且无重复数字的三位数? 都是多少? for i in range(1,5): for j in range(1,5): fo ...
- python创建Django项目
创建Django项目 关注公众号"轻松学编程"了解更多. 创建一个HelloDjango项目 GitHub地址:https://github.com/liangdongchang/ ...
- nodejs中连接mongodb数据库
const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/blog', { useNewUrlParser ...