前端不得不了解的TCP协议
背景
早期的网络是基于OSI(开放式系统互联网,一般叫OSI参考模型)模型,该模型是由ISO国际标准组织制定的,包含了七层(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层),即复杂又不实用,以至于招到了许多批评,所以,当时就有一批技术人员为了方便开发,提高效率,自己开发了一套新的协议,TCP/IP协议,在简化的计算机网络OSI模型中,她完成了第四层传输层所指定的功能
概念
TCP/IP协议(Transmission Control Protocol),翻译过来是传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。包含有四层(应用层、传输层、网际层、网络接口层),不过从实质来讲,TCP/IP协议只有最上面的三层,因为最下面的网络接口层基本上和一般的通信链路的功能上没多大差别
应用层:负责处理特定的应用程序细节。包含各种应用程序协议,如:Telnet远程登录、FTP文件传输协议、SMTP简单邮件传送协议、SNMP简单网络管理协议
传输层:为网络提供了流量控制,错误控制和确认服务。在TCP/IP协议族里面,又包含两个互不相同的传输协议:TCP和UDP,后面会讲解
网际层:提供独立于硬件的逻辑寻址,实现物理地址与逻辑地址的转换,网际层(也叫网络层)协议包括IP协议、ICMP协议以及OGMP协议( Internet 组管理协议)
网络接口层:通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡,它们一起处理与电缆或其他人护额传输媒介的物理接口细节,对应的设备有,传输介质、网卡、交换机
TCP与UDP
TCP和UDP是两种最为著名的传输层协议,二者都使用IP作为网络层协议尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务
TCP
TCP,传输控制协议,面向连接的协议,可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须建立一个TCP连接
特点:
只支持一对一传输(端对端的传输)
数据大小无限制
建立连接通道
速度慢,但是可靠性高
UDP协议
用户数据报协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,UDP提供了无连接通信,适合于一次传输少量数据,UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP
特点:
- 可以一对一、一对多、多对一和多对多的交互通信
- 速度快,但可靠性低
- 数据有大小限制(64k)
- 不需要建立连接
应用:
一般应用于QQ、微信等即时聊天上
TCP和UDP的区别
- TCP面向连接(如打电话要先拨号建立连接),UDP是无连接的,即发送数据之前不需要建立连接
- TCP提供可靠的服务,也就是说通过TCP连接传送的数据,无差错,无丢失,不重复,且按序到达;TCP通过校验和重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制,UDP尽最大努力交付,即不保证可靠交付
- UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信
- 每一条TCP连接只能是点对点,UDP支持一对一、一对多、多对一和多对多的交互通信
- TCP对系统资源要求较多,UDP对系统资源要求较少
三次握手与四次挥手
这个是前端面试中,最经常考的,所以呢,这个我们得重点掌握才行。
tcp的首部数据
在了解三次握手和四次挥手之前,我们得先了解tcp头部数据的宏观位置和首部报文格式,方便我们后面理解
宏观位置
- 数据从应用层->传输层->网络层->链路层,没经过一次都会在保温中增加相应的首部
- tcp数据被封装在ip数据报中
首部报文格式
一行有32个bit即32位,1个字节=8个位,即一行有4个字节
- 16位源端口和16位目的端口:告知主机该报文段是来自哪里(源端口Source Port)以及传给哪个上层协议或应用程序
- 32位序号:用于对字节流进行编号
- 确认号:期望收到的下一个报文段的序号
- 选项:长度不定
- 数据:该TCP协议包负载的数据
标识位说明:
- URC:紧急标志,为1时,表示紧急指针有效
- ACK:确认标志,连接建立成功,总为1,为1时确认号有效
- PSH:接收方应尽快把这个报文交给应用层
- RST:复位标志,重建连接
- SYN:同步标志,该标志仅在三次握手建立TCP连接时有效,它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。
- FIN:关闭连接标志
三次握手
- 三次握手机制是为了保证建立一个安全可靠的连接
- tcp连接是全双工的,数据在两个方向上能同时传递
第一次握手:第一次握手是有客户端发起的,客户端向服务端发送一个报文,在报文里面SYN标志位为1,seq携带一位32位的序列号,当服务端收到这个报文之后,就在知道客户端是想要和我建立一个新的连接
第二次握手:第二次握手是由服务端发起的,服务端在收到客户端在第一次握手时发的报文之后,确定客户端是想和自己建立连接后,,于是服务端就向客户端发送了一个确认消息包,在这个包里面,SYN标志位和ACK标志位都为1,并携带32位的确认序号
以上两次握手后,对于客户端而言,已经明确了客户端既能给服务端发小心,也能收到服务端的响应。但是对服务端而言,两次握手是不够的,到目前为止,服务端只知道一件事情,客户端发给我的消息我能收到,但是客户端能不能收到我的消息我是不知道的,所以,还需要进行第三次握手
第三次握手:第三次握手就是当客户端收到服务端发送的响应报文之后,还要继续去给服务端进行回应,在报文里面携带一个32位的确认序号。
通过以上三次握手之后,不管是客户端还是服务端,都知道,我既能给对方发送消息,也能收到对方的响应,那么这个连接就被安全的创建了
四次挥手
第一次挥手:第一次挥手也是由客户端发起的,客户端会发送一个报文,报文里面FIN标志位为1,表示关闭连接,当服务端收到这个报文之后,就知道客户端想要和我断开连接了
第二次挥手:第二次报文是由服务端发起的,当服务端收到客户端的报文之后,服务端辞职可能还有未发送完的报文消息,需要继续发送,所以此时客户端只能告诉客户端,我知道你要和我断开连接啦,但是我还没准备好,需要等我一下等我好了之后我会通知你的(此时的报文消息里面包含32位确认序号ack和确认标志ACK=1)
第三次挥手:此时的服务端已经准备好了,于是就告诉客户端,我可以断开连接啦,在这条消息报文里面FIN=1,并携带32位的ack确认序号
第四次挥手:当客户端收到服务端的断开连接的报文后,客户端同样需要继续发送一个确认包的报文给服务端。
通过这四次的相互沟通和连接,不断时客户端还是服务端,都已经做好了断开的准备
前端不得不了解的TCP协议的更多相关文章
- 前端工程师如何理解 TCP/IP 传输层协议?
网络协议是每个前端工程师都必须要掌握的知识,TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP,本文将介绍下这两者以及它们之间的区别. TCP/IP网络模型 计算机与网络设备要相 ...
- TCP协议疑难杂症全景解析
说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人. ...
- TCP协议下大数据传输IOCP乱序问题
毕业后稀里糊涂的闭门造车了两年,自己的独立博客也写了两年,各种乱七八糟,最近准备把自己博客废了,现在来看了下这两年写的对我来说略微有点意义的文章只此一篇,转载过来以作留念. 写的很肤浅且凌乱,请见谅. ...
- 在网络7层协议中,如果想使用UDP协议达到TCP协议的效果,可以在哪层做文章?(QQ 为什么采用 UDP 协议,而不采用 TCP 协议实现?)
为了解决这题,可以具体看看下面这个讨论. 解灵运工程师 185 人赞同 某次架构师大会上那个58同城做即时通信的人说:原因是因为当时没有epoll这种可以支持成千上万tcp并发连接的技术,所以他们使用 ...
- 【转载】TCP协议疑难杂症全景解析
说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人. ...
- TCP协议学习总结(中)
很多人都说TCP协议是一个十分复杂的协议,在学习当中,我对协议每一个问题都分解学习后,每一个分解我都能体会和理解它的要点,并不难理解.但我把这些拆分的细节合并后,确认感觉这样一个协议相对“臃肿”但又好 ...
- 即时通信 选择UDP还是TCP协议
之前做过局域网的聊天软件,现在要做运行在广域网的聊天软件.开始接触网络编程,首先是接触到TCP和UDP协议 在网上查资料,都是这样描述 TCP面向连接,可靠,数据流 .UDP无连接,不可靠,数据报.但 ...
- WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]
WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...
- 【转载】TCP协议要点和难点全解
说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面 2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的 3).针对对象:对TCP已经有了全面了解的 ...
随机推荐
- 如何获取下载 FreeBSD
『如何获取下载 FreeBSD 』 『如何获取下载 FreeBSD 』 FreeBSD 是免费获取的. [下载地址] O网页链接 版本选择,尽量选择较新版本,桌面用户可选择 current 版本.st ...
- Spring Boot 轻量替代框架 Solon 的架构笔记
Solon 是一个微型的Java开发框架.项目从2018年启动以来,参考过大量前人作品:历时两年,4000多次的commit:内核保持0.1m的身材,超高的跑分,良好的使用体验.支持:RPC.REST ...
- C语言入门-mingw64安装+配置
OK,大家好,结合上期所说,本期让我们来配置编译器吧! 首先先下载mingw64离线包,官网下载慢,可以去群里下载,*.7z格式(有些同学可能没有解压软件,为了照顾这部分同学,笔者提供*.exe格式的 ...
- 开源项目renren-fast开发环境部署(后端部分)
开源项目renren-fast开发环境部署(后端部分) 说明:renren-fast是一个开源的基于springboot的前后端分离手脚架,当前版本是3.0 开发文档需要付费,官方的开发环境部署介绍相 ...
- HDU_5414 CRB and String 【字符串】
一.题目 CRB and String 二.分析 对于这题,读懂题意非常重要. 题目的意思是在$s$的基础上,按题目中所描述的步骤,即在$s$中任意选择一个字符$c$,在这个字符后面添加一个不等于$c ...
- python中类的魔法方法
__xx__这种方法,在Python中均称为魔法方法 1.__init__(self) 该方法的作用是初始化对象 在创建对象时被默认调用,不需要手动调节 self参数不需要开发者传递,解释器会自动将创 ...
- Just a Joke HDU - 4969(物理+积分)
题目链接:https://vjudge.net/problem/HDU-4969#author=0 题意:一个人在圆心以V2速度追赶一个以V1的速度进行圆周运动,问在圆心的人能否在不超过D的距离追上他 ...
- 攻防世界 reverse 进阶 1-4
1.dmd-50 suctf-2016 md5后比较,在线解md5得到: md5(md5($pass)),所以将grape再进行MD5 b781cbb29054db12f88f08c6e161c199 ...
- [图论]剑鱼行动:kruskal
剑鱼行动 目录 剑鱼行动 Description Input Output Sample Input Sample Output 解析 难点 代码 Description 给出N个点的坐标,对它们建立 ...
- [Azure DevOps] 如何安装并配置 Build Agent
1. 编译服务器 在 Azure Pipelines 中至少需要一个编译服务器的 Agent 才能编译代码或发布软件.Azure DevOps 本身已经提供了一个 Agent,但出于各种理由(需要特殊 ...