文章目录

  • 1.协议格式:
  • 2.协议特性:
    • 2.1 面向链接
      • 2.1.1三次握手建立连接
      • 2.1.1四次挥手断开连接
      • 相关问题和知识点:
        • 1. 握手为啥三次,挥手是四次?
        • 2. 三次握手失败两端是如何处理的?
        • 3. SYN泛洪攻击是怎么回事?
        • 4. 一台主机上出现了大量CLOSE_WAIT状态链接是什么原因?
        • 5. TIME_WAIT状态有什么作用?
        • 6. 一台主机上出现大量TIME_WAIT链接,什么原因,怎么解决?
        • 7. TCP的保活机制(心跳探测)
    • 2.2 可靠传输
      • 2.2.1 安全有序传输(保证数据可靠到达对端并且有序进行交付)
        • 1. 确认应答机制
        • 2. 超时重传机制
        • 3. 协议字段中的序号(th_seq)和确认序号(th_ack)进行包序管理,实现有序交付
        • 4. 协议字段中的校验和校验数据一致性。
      • 2.2.2 避免没必要的丢包
        • 1. 滑动窗口机制
        • 2. 拥塞窗口机制
      • 2.2.3 提高一些传输性能
        • 1. 确认序号
        • 2. 快速重传协议
        • 3. 捎带应答机制:
        • 4. 延迟应答机制
        • 5. 延迟发送机制
    • 2.3 面向字节流传输
  • 3 对应用层编程影响
    • 问题:tcp和udp协议的区别?
    • tcp如何实现可靠传输
    • udp如何实现可靠传输

TCP :传输控制协议

1.协议格式:

  1. 16位源端端口-16位对端端口:描述通信两端

  2. 32位序号-32位确认序号:用于实现包序管理。

  3. 4位报头长度:描述tcp报头长度。4位表示最大数字15;以四字节为单位,所以TCp报头最小长度20字节,最大为15 * 4 = 60字节。

  4. 6位保留

  5. 6位标志位:

         URG: 紧急指针是否有效ACK: 确认应答PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段
    
  6. 16位窗口大小:用于实现滑动窗口机制–进行发送数据的流量控制。防止缓冲区溢出丢包。

  7. 16为校验和:校验数据一致性。

  8. 16位紧急指针:发送的带外数据的位置

  9. 0-40字节选项数据:存储一些可能需要的额外的信息。Mss…

  10. 应用数据

2.协议特性:

2.1 面向链接

面向链接:通信双方建立连接之后才能进行通信,—>确保通信双方都据有数据收发能力

TCP的链接管理:三次握手建立链接,四次挥手断开链接。
主要是为了确认通信双方都在线有数据收发能力。

2.1.1三次握手建立连接

客户端向服务端请求建立连接:

2.1.1四次挥手断开连接

相关问题和知识点:

1. 握手为啥三次,挥手是四次?

三次握收:双发都需要确定对方是否具有数据收发能力。两次不安全—只能确定服务端在线,客户端可能发送完SYN请求后就下线了。四次没必要—SYN和ACK都是报文中的标志位,分开发送没太大意义,直接将这两个标志位都置为1同时发送即可。
四次挥手:双方上层只有在不会发送数据的情况下才会发送FIN(FIN表示上层不再发送数据,但下层还能ACK确认回复)。收到FIN请求只能表示对方上层不再send发送数据,不代表对方不能再收数据了。因此有可能接收FIN请求的一方还会继续给对方发送数据,只有在上层调用了close或者shutdown关闭写才会主动给关闭方发FIN(不再发数据了).所以被动关闭方的FIN和ACK默认不一起发送。

2. 三次握手失败两端是如何处理的?

握手失败情况:
1.SYN请求丢失,客户端没得到确认回复,隔一段时间会重新发送SYN请求。多次发送失败会导致请求超时,连接失败。
2. 服务端发送的ACK+SYN信息丢失。客户端没收到SYN导致服务器没收到相应的的ACK回复,新建的套接字会重新发送ACK+SYN请求。若服务端发送ACK+SYN请求超时(服务端可能会觉得这是恶意攻击请求,只发起连接不回复,占用资源),给客户端发送RST重置连接报文,释放新建套接字的资源。
3. 客户端最后发送的ACK丢了。服务端等待超时,服务端发送RST,释放资源,从新建立连接。

3. SYN泛洪攻击是怎么回事?

黑客伪造ip不断向服务端发送SYN,但是不进行ACK回复,服务端新创建套接字会不断占用资源,直至枯竭崩溃。所以listen(sockfd,backlog)接口中有backlog参数–新建连接队列–队列满了就不会再新建套接字。处理方法:防火墙–同一ip频繁发送数据则拉黑名单。

4. 一台主机上出现了大量CLOSE_WAIT状态链接是什么原因?

CLOSE_WAIT状态是被动关闭方收到FIN请求并进行ACK回复之后进入到的状态。一旦自己发送了FIN(close操作后就会发送FIN)则会进入下一个LAST_ACK状态,因此有大量CLOSE_WAIT,意味着代码中可能没有对连接断开的套接字进行close操作。解决方案就是检查代码。

5. TIME_WAIT状态有什么作用?


TIME_WAIT状态是主动关闭方在收到对方FIN后,进行最后一次ACK回复后进入的状态。如果最后一次ACK丢失了,被动关闭方等待没收到ACK,则会重新发送FIN(只重传一次),所以TIME_WAIT状态就是等待这次可能重传的ACK。
TIME_WAIT实际上是为了保护新建套接字不会使用刚被释放的套接字的地址和端口,防止原先通信的数据对新连接造成的影响(本来需要发送到原先套接字的重传FIN发送送到了新套接字的通信会话中)。
TIME_WAIT会等待两个MSL(最大报文生存周期)时间---->最后重传FIN和ACK的时间 X 2,确保本次通信的数据都消失在网络中,不会对新的连接造成影响。
TIME_WAIT实际上更多是为了保护客户端,客户端通常不主动绑定地址信息,交给系统分配;而服务端通信通常需要绑定相同的地址信息,重启之后地址信息不变。

6. 一台主机上出现大量TIME_WAIT链接,什么原因,怎么解决?

TIME_WAIT是主动关闭方最后一次发送ACK产生的。
出现大量TIME_WAIT则是因为大量主动关闭套接字,常见于爬虫主机。
解决方案:将TIME_WAIT等待时间设置更短一些。
或:设置套接字选项,开启地址复用,常见于服务端。
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
level:SOL_SOCKET
optname:SO_REUSEADDR

7. TCP的保活机制(心跳探测)

默认情况:通信双方7200s没有通信,则服务端每隔75s会向客户端发送一个保活探测数据包,要求客户端进行回复,连续9次没有进行回复则认为连接断开。
可以设置保活时间和次数。
连接断开在后程序在上层的表现:recv返回0;send会触发SIGPIPE异常—>会导致进程异常退出,可自定义SICPIPE信号的处理方式。

2.2 可靠传输

2.2.1 安全有序传输(保证数据可靠到达对端并且有序进行交付)

面向链接(前提):首先确保双方都具有数据收发能力

1. 确认应答机制

实现丢包检测功能,接收方针对接收的每一条数据都应该进行确认回复。
发送方收到确认回复认为传输成功,否则认为数据丢包。

2. 超时重传机制

发送方等待超时没有得到确认回复,则会对数据包重新传输。超时等待时长会随着网络环境的不同, 是有差异的.如果超时时间设的太长, 会影响整体的重传效率;如果超时时间设的太短, 有可能会频繁发送重复的包;

3. 协议字段中的序号(th_seq)和确认序号(th_ack)进行包序管理,实现有序交付

利用==协议字段中的序号(th_seq)和确认序号(th_ack)==进行包序管理,实现有序交付。

举个例子感受一下序号(th_seq)和确认序号(th_ack)的作用,下图中seq为其实序号,ack表示确认序号。

4. 协议字段中的校验和校验数据一致性。

数据不一致则丢弃,丢弃则无针对此数据的确认回复,对方收不到确认回复则重传此数据;也可直接发送重传请求。

2.2.2 避免没必要的丢包

丢包情况:

  1. 发送方发送数据过多,接收方来不及处理,缓冲区溢出之后所产生的丢包。
    2.>传输起始或者过程中网络突然变差所导致的大量丢包。
1. 滑动窗口机制

依赖于协议字段中的窗口大小字段实现,避免发送方发送数据过多,接收方来不及处理,缓冲区溢出之后所产生的丢包。
原理:接收方接收数据之后就会进行确认应答,这时候会通过窗口大小字段告诉对方最多再给自己发送多少数据。窗口大小不能大于接收缓冲区剩余空间大小。
实现:通信双方都会维护一个发送窗口和接收窗口。
图画不动了,参考文章:网络 滑动窗口机制,这个里面有比较图解,过程较详细。

相关概念:

MSS:最大数据段大小,表示一个TCP报文中数据的最大大小。

相关协议:

停等协议:发送数据之后,收到确认回复才会发送下一条。适合网络环境差的场景。
回退n步协议:那一条数据丢失,则从丢失的数据包开始整体重传。
选择重传协议:哪条丢失重传哪条。适用于网络环境较好的场景。
2. 拥塞窗口机制

拥塞窗口机制:解决网络突然变差产生大量丢包的问题。
原理:发送方维护了一个拥塞窗口,用于限制当前所能发送的数据量。拥塞窗口大小是一种慢启动快增长(指数上涨,阈值为窗口大小)的形式进行传输控制。防止突然网络变差,导致大量丢包。每次丢包都会进行一次网络状况探测的过程。

2.2.3 提高一些传输性能

tcp为了实现可靠传输,牺牲了传输性能,而在传输过程中,有些性能上的损失是没有必要的。

1. 确认序号

确认序号标识序号之前的数据都已经收到了,为了避免因为确认应答丢失导致的重传。

2. 快速重传协议

在传输过程中,若接收方接收到的数据并非是接收窗口后沿数据,则有理由认为前边发送的数据丢失了,这时候每收到一条数据就会发送一条后沿数据的重传请求,一旦发送方连续收到三条(三条是为了避免数据延迟到达的情况)相同重传请求,则直接对这条数据(确认序号的数据)进行重传。丢包后不用完全等待超时重传,节省时间。

3. 捎带应答机制:

接收方对接收到的每一条数据都需要进行确认回复,然而确认回复最主要的信息就是确认序号,因此每一条确认回复都是一个tcp传输,至少是一个空报头(没有实际数据)的传输。如果收到数据后刚好要给对方发送数据,则将及即将要发送的数据和确认回复放到一起进行发送(在要发送的数据报头中加入确认序号)。

4. 延迟应答机制

接收方对接收到的每一条数据都需要进行确认回复,其中包含有当前窗口大小字段,如果立即进行回复,窗口大概率是不断减小的,因此延迟进行确认回复,有可能上层将数据取出,维持窗口大小。通过这种方式保证传输吞吐量不会降低。

5. 延迟发送机制

tcp传输过程中,如果对每次send的数据直接封装报头进行发送,若发送的数据比较小,但是次数较多,则io次数比较多,效率低。因此延迟发送,将数据在发送缓冲区中先堆积起来,再合适的时候一次性发送,减少了io次数,提高效率。
nagle算法–通过套接字选项设置(默认是开启的)

2.3 面向字节流传输

面向字节流传输:可靠的,有序的,双向的,基于连接的,以字节为单位的传输方式。传输时,并不限制上层(send \ recv)发送或者接收的数据大小。tcp延迟发送数据在缓冲区中积攒,基于mss取出合适大小数据进行发送。
优势:相对于面向数据报来说,传输更加灵活。
缺陷:产生粘包问题—将多条数据当作一条数据处理。
产生粘包的原因:tcp不会对数据进行边界处理。
解决方案:程序员需要在应用层进行数据的边界管理。可用特殊字符作为间隔(需要考虑特殊字符转译);使用TLV格式数据(在应用层头部加入数据长度);数据定长----提前约定会定长的数据,但是数据太短需要进行补全;

3 对应用层编程影响

  1. 连接断开:recv返回0,send触发异常。
    recv一旦返回0,就要考虑文件描述符的回收关闭
    Send因为会触发一次导致进程退出,若不想退出进程需要自定义信号处理。
  2. tcp传输存在粘包问题,需要在应用层进行数据边界管理。udp整条交付,无粘包问题。
问题:tcp和udp协议的区别?

实现上的区别:协议格式,协议字段不一样。
特性上的区别:TCp是面向连接的可靠的字节流传输方式。udp是无连接不可靠面向数据报的传输方式。udp支持广播,tcp不支持。
应用场景上的区别:UDP适用于实时性高于安全性的场景,tcp用于传输安全性高于实时性的场景。

tcp如何实现可靠传输
  1. 确认应答机制
  2. 超时重传机制
  3. 协议字段中的序号(th_seq)和确认序号(th_ack)进行包序管理,实现有序交付
  4. 协议字段中的校验和校验数据一致性。
udp如何实现可靠传输

ud协议本身没有实现可靠传输,需要在应用层手动实现类似tcp的可靠传输机制:确认应答机制,超时重传机制,包序管理。

TCP协议格式和特点相关推荐

  1. 网络基础2-3(TCP协议,三次握手,四次挥手,TIME_WAIT状态的作用,TCP如何保证可靠传输,TCP连接中状态转化,滑动窗口,流量控制,快速重传,拥塞窗口,延迟应答,捎带应答,粘包问题)

    TCP协议 TCP协议概念 TCP全称为 "传输控制协议(Transmission Control Protocol"). 人如其名, 要对数据的传输进行一个详细的控制 TCP协议 ...

  2. 网络 传输层 | UDP协议与TCP协议详解(三次握手及四次挥手、滑动窗口、拥塞控制)

    概念 传输层:是负责应用程序之间的数据传输(通过端口的描述,描述了哪两个进程间的通信):传输层的两个主要协议:UDP 和 TCP UDP协议 UDP协议全称:用户数据报协议(User Dategram ...

  3. 网络原理之TCP协议特性

    TCP协议: TCP,即Transmission Control Protocol,传输控制协议.人如其名,要对数据的传输进行一个详细的 控制.TCP是相对可靠并不是绝对的安全. TCP协议格式段 6 ...

  4. TCP协议与UDP协议详解

    TCP协议 TCP,即Transmission Control Protocol,传输控制协议.人如其名,要对数据的传输进行一个详细的控制. TCP协议的特点:有连接,可靠传输,面向字节流,全双工 有 ...

  5. TCP协议调试工具TcpEngine V1.3.0使用教程

    简介 这里说的TCP协议调试定义是在开发长连接TCP协议应用时,为了验证代码流程或查找bug,需要与对端交互数据过来,当需要时可以暂停发送:单条发送:跳过发送:正常发送:发送时修改数据等. TcpEn ...

  6. 传输层协议 ——— TCP协议

    文章目录 TCP协议 谈谈可靠性 TCP协议格式 序号与确认序号 窗口大小 六个标志位 确认应答机制(ACK) 超时重传机制 连接管理机制 三次握手 四次挥手 流量控制 滑动窗口 拥塞控制 延迟应答 ...

  7. 传输层——TCP协议

    目录 一.初步认识 二.TCP协议格式 2.1 初识协议格式 2.2 序号与确认序号 2.3 16位窗口大小 2.4 六个标志位 三.确认应答机制 四.超时重传机制 五.连接管理机制 5.1 三次挥手 ...

  8. 【Linux】 -- TCP协议 (一)

    TCP协议 Tcp协议 可靠性 冯诺依曼体系结构 TCP的协议格式 序号与确认序号 窗口大小 六个标志位 确认应答机制 (ACK) 超时重传机制 连接管理机制 Tcp协议 TCP全称为 "传 ...

  9. (TCP-over-UDP library)基于UDP协议之上实现通用、可靠、高效的TCP协议

    随着互联网应用广泛推广,出现了越来越多的网络应用,其中基于p2p思想的各种网络技术的产品也越来越多的出现在我们的视野当中.从最早闻名的Napster到现在的Bittorrent.eMule.skype ...

  10. 长连接Tcp协议分析工具

    目前主流的网络协议分析工具主要有开类,一类是对就网络包底层数据包的分析,如Wireshark:另一类是针对http协议的分析工,如Fiddler.但是还有第三类网络协议长连接Tcp协议,如游戏协议.跟 ...

最新文章

  1. ActiveMQ常见问题
  2. Cascading(一)之日志解析
  3. python mro c3_Python 19 MRO和C3算法
  4. 一个轻量级分布式RPC框架--NettyRpc
  5. ASP.NET Web API 接口执行时间监控
  6. 分类算法----逻辑回归预测
  7. 通过Filter统一全站编码
  8. request.getRequestDispatcher().forward(request,response)和response.sendRedirect()的区别
  9. Vue+Webpack常见问题(持续更新)
  10. 麒麟MIPS:用光盘安装提示Out Of Memory,用U盘安装成功
  11. Android新浪微博开发(3)JSon解析
  12. Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
  13. win10本地策略组脚本
  14. 【C语言】斐波那契数列
  15. vue3.x自定义换肤
  16. 比较两个路径的几种方式
  17. 信托公司消金小额贷款项目的现金流预测
  18. AndroidIOS APP启动速度专项测试方法
  19. sqlserver 登录方式修改,由默认的windows账户改为用sa等sql server账户登录问题
  20. 前端与后台(学习自某B站Up主)

热门文章

  1. 元数据看板的初步设计思路
  2. java中实现热门搜索的逻辑_Java编程的逻辑 (45) - 神奇的堆
  3. dos下的硬盘检测工具MHDD图文教程
  4. spring源码系列(一)——spring循环引用
  5. 【Python 3.7】序数:序数表示位置,如 1st和 2nd。大多数序数都以 th结尾,只有 1、2和 3 例外。
  6. 傻瓜式脱壳保姆级教学
  7. i5 10400f和i7 8700k哪个好
  8. 8篇论文详解用户历史行为序列建模方法
  9. php收银系统如何连接pos机,收银pos机怎么连接?
  10. 华为:拿什么留住员工