可靠的TCP连接为何是三次握手和四次挥手
首先,咱们先来熟悉下经典的tcp/ip模型。
他们作用分别为:
1)网络接口层:主要作用是将ip地址和计算机的物理地址互相绑定,并实现二进制流和计算机硬件的高低电位的转换。
2)网络层:主要作用是通过ip地址将两台物理机链接起来,实现ip数据包的传输;
3)传输层:使源端主机和目标端主机上的对等实体可以进行会话。在传输层定义了两种服务质量不同的协议。即:传输控制协议TCP(transmission control protocol)和用户数据报协议UDP(user datagram protocol)。;
4)应用层:负责传送各种最终形态的数据,是直接与用户打交道的层,典型协议是HTTP、FTP等。
今天咱们主要来看下tcp模型中主要的tcp协议。
计算机通信中,要想实现可靠的网络通信,tcp协议是必不可少的一环。那么tcp协议是如何实现可靠通信的呢?这就首先要从经典的三次握手谈起。
三次握手即客户端与服务器至少(网络超时的话会多于三个)要发送三个数据包来建立tcp连接。
第二次握手:服务器收到请求之后,发送数据包给客户端,服务器状态变为SYN_RECV,数据包内容包含标志位SYN和ACK,值都为1。确认序列号ack值为j+1,随机序列号seq,假设值为i。
第三次握手:客户端收到服务端的数据包,验证ACK和SYN为1后,发送一个确认数据包,客户端进入ESTABLISHED状态,数据包包括标志位ACK,值为1。确认序列号ack,值为i+1。序列号seq,值为j+1.
补充说明下:确认序列号ack表示的是下一次收到的包的seq,接收方通过seq和len来确认数据包是否有效,是丢弃数据包,还是放入正常数据包序列或者是放入失序数据包序列。
那么下面咱们来看下为啥tcp是三次握手,不是两次,一次或者四次。
第一次握手:
a发送一个数据包给b。如果只握一次手,就建立连接,显然是不可能的,a连b的真实性都不知道。
第二次握手:
b收到连接请求后,发送确认建立连接请求。如果两次握手就成功建立连接的话会出现一个问题:
a给b发送了一个请求连接包,由于网络原因,过了很久之后b才收到这个包,b收到之后,向a返回一个数据包。这个时候由于时间超时,a会丢掉这个数据包。如果是两次握手的话,这时候b状态为成功建立连接,会一直等待a传输数据。这样会导致服务器资源浪费。
第三次握手:
a收到b的确认连接请求后,验证数据正确后,再向a发送一个确认请求,b收到后验证数据是否正确。正确后即连接建立成功。
三次握手可以很好的避免网络超时导致的丢包情况,服务器和客户端都要分别收到正确的ACK之后才能表示连接建立,如果未收到,就会启用超时重传机制。当然如果网络确实比较差,导致连接无法建立,也不可能一直重传。操作系统中会有设置重传次数这个字段,以避免无效重转。
为啥不四次握手:
最开始本来是四次握手,四次握手的情形是服务器发送的SYN和ACK是分开发送的,所以是四次,后面给进行了优化,所以就成为了三次握手。
挥手。
当客户端和服务器通过三次握手建立了TCP连接以后,就可以进行数据通信了,通信完毕后,双方就可以断开连接了,断开连接就会涉及到咱们的四次挥手了。下面咱们来简单看下tcp的四次挥手。
第一次挥手:
client发送一个标志位FIN为1和一个seq为m的数据包;
第二次挥手:
server收到了client发送的FIN报文段,向client回一个ACK报文段,ack值为m+1,server告诉client,我“同意”你的关闭请求,这个时候client不能在发送数据,server不能再接收数据,server还能给client发送数据;
第三次挥手:
server向client发送FIN报文段,请求关闭连接,同时server进入LAST_ACK状态;
第四次挥手:
client收到server发送的FIN报文段,向server发送ACK报文段,然后client进入TIME_WAIT状态;server收到client的报文段以后,就关闭连接;此时,client等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,client也可以关闭连接了。
至于为啥是四次挥手,本质的原因是咱们的tcp连接是全双工的,在两个方向都需要关闭,所以两个方向都需要发送一个关闭请求和确认请求。
下面介绍下tcp可靠的一个重要机制,超时重传。
超时重传是TCP协议保证数据可靠性的一个重要机制,其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止。三次握手,正常的数据传输,以及四次握手过程中只要出现超时情况,都会触发重传。
那么tcp是如何界定超时的呢,这时候又引出两个新东西。一个是RTT,另外个是RTO。感兴趣的同学可以下去了解,这里就不再详细介绍了。
总结:tcp协议是一个很复杂的协议,本篇文章由于篇幅原因只是简单的介绍了其中很小一个知识点,并没有很深层次的介绍tcp,如有更多疑惑,欢迎留言讨论。
参考博客:https://juejin.im/post/5b1e9c65f265da6e26099bf3
可靠的TCP连接为何是三次握手和四次挥手的更多相关文章
- TCP的基本概念三次握手,四次挥手
TCP的特性 TCP提供一种面向连接的.可靠的字节流服务 在一个TCP连接中,仅有两方进行彼此通信.广播和多播不能用于TCP TCP使用校验和,确认和重传机制来保证可靠传输 TCP使用累积确认 TCP ...
- TCP协议中的三次握手和四次挥手(图解)【转】
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. [更新于2017.01.04 ]该部分内容配图有误,请大家见谅,正确的配图如下,错误配图也不删 ...
- tcp建立连接为什么需要三次握手和四次挥手
前言 众所周知tcp传输层协议在建立连接的时候需要三次才能建立起一个真正的可靠连接,可是为什么是三次呢,不可以是两次,四次等等呢,可以自己思考一番,带着疑问可以看下文. 三次握手 在<计算机网络 ...
- 真的懂了:TCP协议中的三次握手和四次挥手(关闭连接时, 当收到对方的FIN报文时, 仅仅表示对方不在发送数据了, 但是还能接收数据, 己方也未必全部数据都发送对方了。相当于一开始还没接上话不要紧,后来接上话以后得让人把话讲完)
一.TCP报文格式 下面是TCP报文格式图: (1) 序号, Seq(Sequence number), 占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记. (2) 确 ...
- TCP常见的定时器三次握手与四次挥手
1.TCP常见的定时器 在TCP协议中有的时候需要定期或者按照某个算法对某个事件进行触发,那么这个时候,TCP协议是使用定时器进行实现的.在TCP中,会有七种定时器: 建立连接定时器(connecti ...
- 网络编程简介(OSI七层协议,TCP协议原理,三次握手与四次挥手)
目录 网络编程 软件开发架构 C/S架构 B/S架构 网络编程的发展史 互联网协议 1.物理连接层 2.数据链路层 3.网络层 4.传输层 5.应用层 三次握手四次挥手 三次握手建链接 数据传输 四次 ...
- python网络编程-TCP协议中的三次握手和四次挥手(图解)
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...
- TCP协议中的三次握手和四次挥手(图解)
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...
- [转]TCP协议中的三次握手和四次挥手(图解)
本文转自:http://blog.csdn.net/whuslei/article/details/6667471 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来 ...
随机推荐
- Oracle COALESCE函数
Oracle COALESCE函数 Oracle COALESCE函数语法为COALESCE(表达式1,表达式2,...,表达式n),n>=2,此表达式的功能为返回第一个不为空的表达式,如果都为 ...
- http常见状态码分析
200:这个是最常见的http状态码,表示服务器已经成功接受请求,并将返回客户端所请求的最终结果 301:客户端请求的网页已经永久移动到新的位置,当链接发生变化时,返回301代码告诉客户端链接的变化, ...
- JSON+如何处理JSON字符串
JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,且易于让人阅读.尽管JSON是在Javascript的一个子集,但JSON是独立于语言的文本格 ...
- redis的日常操作(1)
一.简介 [概述] redis是一种nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string ...
- MySQL 对 IP 字段的排序问题
MySQL 对 IP 字段的排序问题 问题描述 想对一张带有 IP 字段的表,对 IP 字段进行升序排序,方便查看每个段的 IP 信息. 表结构和表数据如下: SET NAMES utf8mb4; ; ...
- linux常用命令(13)tail命令
tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新, ...
- JQuery II
jQuery事件的绑定 <body> <button>点击1</button> <button>点击2</button> </body ...
- C学习笔记-文件操作
文件操作大致分三步 打开文件 读写文件 关闭文件 二进制和文本模式的区别 在windows系统中,文本模式下,文件以"\r\n"代表换行.若以文本模式打开文件,并用fputs等函数 ...
- XXE漏洞简析
0x00.什么是XXE? XML外部实体注入(XML External Entity Injection) XML基础 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型. ...
- 针对yarn的8088端口攻击
参考: https://www.wangbokun.com/%E8%BF%90%E7%BB%B4/2019/09/02/%E6%8C%96%E7%9F%BF%E7%97%85%E6%AF%92.htm ...