首页 > 其他分享 >TCP

TCP

时间:2023-01-03 15:56:13浏览次数:37  
标签:报文 TCP 发送 数据 服务端 客户端

引言

  • TCP提供面向连接的、可靠的字节流服务
  • 在一个TCP连接中,仅有两方进行彼此通信
  • TCP通过下列方式提供可靠性
    • 应用数据被分割成TCP认为最适合发送的数据块。这和UDP不同,应用程序产生的数据报长度不变。
    • 超时重传。TCP发出一个段后,会启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段。
    • 当TCP收到另一端的数据,他将发送一个确认。这个确认不是立即发送,有延迟。
    • TCP将保持首部和数据的校验和。如果接收端的校验和有差错,将丢弃这个报文且不确认收到,从而发送端会超时重传。
    • TCP报文段可能失序,如有必要TCP会对接收到数据段进行排序。
    • TCP接收端会丢弃重复的报文段
    • TCP提供流量控制。TCP连接的每一方都有固定大小的缓冲区,接收端只允许另一端发送接收端缓冲区所能接纳的数据。

TCP的首部


  • 32位序号:指发送数据的位置。每发送一次数据,就累加一次该数据字节数的大小。
  • 32位确认序号:指下一次应该收到的数据的序列号,也就是目的端期望源端的下一个请求序号
  • 4位首部长度:TCP首部长度,一般20字节,最大20 + 40(上图的选项,最大40字节) = 60字节
  • 6个标志位:
    • URG,该位为1时,表示包中有需要紧急处理的数据。
    • ACK,该位为1时,确认应答的字段变为有效,TCP规定除了最初建立连接是SYN包之外该位必须设置为1.
    • PSH,该位为1时,表示需要将收到的数据立刻传给应用层;为0时,则不需要立即传而是先进行缓存。
    • RST,该位为1时,表示TCP连接中出现异常必须强制断开连接。
    • SYN,用于建立连接。该位为1时,表示希望建立连接,并在其序列号的字段进行序列号初始值的设定。
    • FIN,该位为1时,表示今后不会再有数据发送,希望断开连接。
  • 16位窗口大小:用于通知从相同TCP首部的确认应答号所指位置开始能够接收的数据大小。TCP不允许发送超过此处所示大小的数据。但如果窗口为0,则表示可以发送窗口探测,以了解最新的窗口大小。这个数据必须是1个字节。
  • 16位校验和:校验和覆盖了整个TCP报文段(TCP首部 + TCP数据),这是一个强制性字段,一定是由发端计算和存储,收端进行验证。
  • 16位紧急指针:只有URG标志位为1时有效。该字段的数值表示本报文段中紧急数据的指针。(从数据部分的首位到紧急指针所示的位置为止为紧急数据,即紧急指针指出了紧急数据的末尾在报文段中的位置)

TCP连接的建立与终止

3次握手

  1. 客户端发送一个SYN段指明打算连接的服务端端口,以及初始序号ISN(initial sequence number)。发送完成后客户端进入SYN_SEND状态

  2. 服务端确认。ACK = 客户端SYN + 1, 同时生成自己的SYN和ISN。发送完成后服务端进入SYN_RCVD状态

  3. 客户端确认。ACK = 服务端SYN + 1。客户端发送完毕后,进入ESTABLISHED状态,服务端接收到这个包,也进入ESTABLISHED状态, TCP握手结束

4次挥手

  1. 客户端打算关闭连接,向服务端发送FIN报文。客户端进入FIN_WAIT_1状态
  2. 服务端确认。ACK = 客户端FIN + 1。服务器进入CLOSE_WAIT(等待关闭)状态,此时的TCP处于半关闭状态(下面会说什么是半关闭状态),客户端到服务器的连接释放。客户端收到来自服务器的ACK应答报文段后,进入FIN_WAIT_2状态。
  3. 服务端打算关闭连接,向客户端发送FIN报文。服务端进入LASK_ACK(最后确认)状态,等待客户端的确认。
  4. 客户端确认。ACK = 服务端FIN + 1。客户端进入TIME_WAIT(时间等待)状态,服务器收到ACK应答报文段后,服务器就进入CLOSE(关闭)状态,到此服务器的连接已经完成关闭。客户端处于TIME_WAIT状态时,此时的TCP还未释放掉,需要等待2MSL后,客户端才进入CLOSE状态。

半关闭状态:TCP提供了连接的一方在结束它的发送后还能接受来自另一端数据的能力。通俗来说,就是不能发送数据,但是还可以接受数据。
MSL(Maximum Segment LifeTime)是报文最大生成时间,它是任何报文在网络上存在的最长时间,超过这个时间的报文将被丢弃。TIME_WAIT等待时间是2MSL即报文一来一回的最大时间。

标签:报文,TCP,发送,数据,服务端,客户端
From: https://www.cnblogs.com/miyanyan/p/17022474.html

相关文章

  • 了解一下基本的tcp代理配置
    我们首先用一个简单例子了解一下基本的tcp代理配置worker_processes1;#nginxworker数量error_loglogs/error.log;#指定错误日志文件路径events{......
  • TCP IP网络编程(13) Linux下epoll与多线程
    优于select的epoll1.epoll的理解与应用  select服用方法由来已久,在《TCP/IP网络编程(6)》中,介绍了如何使用select方法实现IO复用。但是利用该技术后,无论如何优化程......
  • TCP和UDP协议之间的区别,前端基础面试题
    前端基础面试题,TCP和UDP协议之间的区别tcp和udp作为传输层的两个协议,主要区别:1,tcp是面向链接的,(http协议握手)就类似打电话要先建立拨号,在进行链接。而udp在发送前......
  • 第十五章《网络编程》第3节:基于TCP协议的网络编程
    ​如果希望开发一个类似于QQ那样的即时通信软件,就必须使用基于TCP协议的编程技术。基于TCP协议的编程可以实现在通信两端建立虚拟网络链路,这样的话通信两端的程序就能通过虚......
  • 一个TCP连接可以发送多少个HTTP请求?
    想要回答这个问题先要知道这5个问题:1.TCP连接是否会在一个请求结束后就断开链接?在HTTP1.0中一个服务器在发送完一个http响应后会断开tcp链接,每次请求都会重新建立和断开t......
  • TCP的三次握手四次挥手详解
    想要了解TCP的三次握手和四次挥手,首先要了解TCP的头部结构TCP的头部结构如下16位源端口号:客户端地址信息16位目标端口号:服务端地址信息32位序列号:请求报文端数据流子节开......
  • TCP IP网络编程 IO分离
    IO流分离  在《套接字与标准IO》中介绍,调用fopen函数打开文件后,可以与文件进行交换数据。因此可以说调用fopen函数之后创建了"流(stream)",此处的"指"数据流动,但是通常......
  • tcp 拥塞控制优化网址
    TCP拥塞控制优化:https://plantegg.github.io/2019/06/21/%E5%B0%B1%E6%98%AF%E8%A6%81%E4%BD%A0%E6%87%82TCP--%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E5%A4%A7%E5%85%A8/......
  • 检测TCP/UDP端口的连通性
    1.TCP端口的连通性TCP端口的连通性,一般通过telnet检测,命令格式如下:telnet<targetHost><targetPort>如果出现以下内容,则表示TCP端口连通性是OK的:[root@localhost~......
  • TCP&UDP
    TCP(6)特点三次握手建立可靠连接端口号多路复用完整性校验差错检测确认机制序列号窗口机制TCP报文  端口号范围0~65535sequencenumber序列号acknowl......