目录
一、网络协议模型
二、TCP/UDP
什么时候应该使用TCP?
什么时候应该使用UDP?
三、TCP报文
四、TCP三次握手
为什么要三次握手?
五、四次分手
为什么要四次分手?
为什么要等待2MSL?
我们在学习计算机网络的过程中肯定会学习到它的传输方式,以及他的工作模型等。下面给大家分享自己借鉴总结的相关知识点,跟大家分享,大自然的搬运工。
首先,我们先了解下TCP/IP协议模型,并与OSI模型的对比参考
应用层 | 应用层 | |
表示层 | ||
会话层 | ||
传输层 | 传输层 | |
网络层 | 网络层 | |
数据链路层 | 网络接口层 | |
物理层 |
这次我们要分析的TCP属于网络层协议,其中还包括UDP(后边一起吐槽),虽然都在网络层,但也有不同的特性,同时也具有不同的应用场景,下边对比分析。
TCP | UDP | |
可靠性 | 可靠 | 不可靠 |
连续性 | 面向连接 | 无连接 |
报文 | 面向字节流 | 面向报文 |
效率 | 传输效率低 | 传输效率高 |
双工性 | 全双工 | 一对一、一对多、多对一、多对多 |
流量控制 | 滑动窗口控制 | 无控制 |
拥塞控制 | 慢开始、拥塞避免、快重传、快恢复 | 无 |
传输速度 | 慢 | 快 |
应用场景 | 对效率要求低,对准确性要求高或者要求有连接的场景 | 对效率要求高,对准确性要求低 |
应用协议层 | SMTP、TELNET、HTTP、FTP等 | DNS、TFTP、SNMP、NFS等 |
什么时候应该使用TCP?
当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。
什么时候应该使用UDP?
当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。
16位 | 16位 | |||||||
TCP首部 | 源 端 口 | 目 的 端 口 | 20字节的固定首部 | |||||
序 号 | ||||||||
确 认 号 | ||||||||
数据偏移 | 保留 | URG | ACK | PSH | RST | SYN | FIN | 窗 口 |
校 验 | 紧 急 指 针 | |||||||
选项(长度可变) | 填 充 | |||||||
数 据 |
URG(urgent) :紧急指针是否有效。为1,表示某一位需要被优先处理
ACK(acknowledgement):确认号是否有效,一般置为1
PSH(push):提示接收端应用程序立即从TCP缓冲区把数据读走
RST(reset):对方要求重新建立连接,复位。
SYN(synchronous):请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1
FIN (finish):希望断开连接。
第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
TCP三次握手就好比两个人在街上隔着50米看见了对方,但是因为雾霾等原因不能100%确认,所以要通过招手的方式相互确定对方是否认识自己。
- 张三首先向李四招手(syn),李四看到张三向自己招手后,向对方点了点头挤出了一个微笑(ack)。张三看到李四微笑后确认了李四成功辨认出了自己(进入estalished状态)。
- 但是李四还有点狐疑,向四周看了一看,有没有可能张三是在看别人呢,他也需要确认一下。
- 所以李四也向张三招了招手(syn),张三看到李四向自己招手后知道对方是在寻求自己的确认,于是也点了点头挤出了微笑(ack),李四看到对方的微笑后确认了张三就是在向自己打招呼(进入established状态)。
- 于是两人加快步伐,走到了一起,相互拥抱
为什么要三次握手?
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
具体例子:“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。
第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;
第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
TCP断开链接的过程和建立链接的过程比较类似,只不过中间的两部并不总是会合成一步走,所以它分成了4个动作,张三挥手(fin)——李四伤感地微笑(ack)——李四挥手(fin)——张三伤感地微笑(ack)。
- 之所以中间的两个动作没有合并,是因为tcp存在「半关闭」状态,也就是单向关闭。
- 张三已经挥了手,可是人还没有走,只是不再说话,但是耳朵还是可以继续听,李四呢继续喊话。等待李四累了,也不再说话了,超张三挥了挥手,张三伤感地微笑了一下,才彻底结束了。
为什么要四次分手?
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
为什么要等待2MSL?
MSL:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间。原因有二:
保证TCP协议的全双工连接能够可靠关闭
保证这次连接的重复数据段从网络中消失
第一点:如果主机1直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致主机2没有收到主机1最后回复的ACK。那么主机2就会在超时之后继续发送FIN,此时由于主机1已经CLOSED了,就找不到与重发的FIN对应的连接。所以,主机1不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。
第二点:如果主机1直接CLOSED,然后又再向主机2发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达主机2,由于新连接和老连接的端口号是一样的,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。
————————————————
借鉴原文链接:
掘金:https://juejin.im/post/598ba1d06fb9a03c4d6464ab(关于 TCP/IP,运维必知必会的十个问题)
CSDN:https://blog.csdn.net/qq_25948717/article/details/80382766(TCP三次握手中SYN,ACK,Seq含义)
简书:https://www.jianshu.com/p/573700560be0(TCP报文格式说明)
知乎:https://zhuanlan.zhihu.com/p/40667482(【TCP】详解TCP 三次握手和四次挥手)