Linux网络编程 | TCP详解

文章目录

  • 前言
  • 一、TCP是什么
  • 二、TCP粘包问题
  • 三、TCP怎么保证可靠性
  • 四、TCP三次握手,四次挥手
  • 五、TCP状态转移图
  • 总结


前言

总结TCP相关问题


提示:以下是本篇文章正文内容,下面案例可供参考

一、TCP是什么

TCP是一种面向链接的,可靠的,流式服务。

二、TCP粘包问题

TCP 字节流的特点,发送端执行的写操作次数和接收端执行的读操作次数之间没有任何数量关系,应用程序对数据的发送和接收是没有边界限制的。
此时可以看到Linux网络编程 | TCP详解_第1张图片
此时可以看到,发送端分别发送了hello world linux,而在接收端一次性收取完成,无法有效区分出三个单词,这就造成粘包问题
解决方法:
1.发送端每次发送之后要收到接收端的回复再进行下一次发送
2.制定协议,比如长宽高分别用【长】【宽】【高】表示。

三、TCP怎么保证可靠性

可靠性:
超时重传,应答确认,乱序重排

流量控制:
滑动窗口:TCP 协议是利用滑动窗口实现流量控制的。一般来说,我们总是希望数据传输得更快一些,不会一次只发一个字节。但是如果发送方把数据发得过快,接受方就可能来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。
Linux网络编程 | TCP详解_第2张图片

拥塞控制:
慢启动,拥塞避免,快速恢复
Linux网络编程 | TCP详解_第3张图片快速重传
Linux网络编程 | TCP详解_第4张图片

四、TCP三次握手,四次挥手

三次握手示意图:
Linux网络编程 | TCP详解_第5张图片
四次挥手示意图:
Linux网络编程 | TCP详解_第6张图片
三次握手:

主动发起连接请求端,发送SYN标志位,请求建立连接。携带序号号、 数据字节数(0)、滑动窗口大小。
被动接受连接请求端,发送ACK标志位,同时携带SYN 请求标志位。携带序号、确认序号、数据字节数(0)、滑动窗口大小。
主动发起连接请求端,发送ACK标志位,应答服务器连接请求。携带确认序号。
四次挥手:
主动关闭连接请求端,发送 FIN标志位。
被动关闭连接请求端,应答 ACK标志位。----半关闭完成。
被动关闭连接请求端,发送 FIN标志位。
主动关闭连接请求端,应答 ACK标志位。-----连接全部关闭

五、TCP状态转移图

Linux网络编程 | TCP详解_第7张图片
结合三次握手四次挥手:
Linux网络编程 | TCP详解_第8张图片
1.主动发起连接请求端: CLOSE --发送SYN – SEND_ _SYN --接收ACK、SYN – SEND _SYN --发送ACK – ESTABLISHED (数据通信态)

2.主动关闭连接请求端: ESTABLISHED (数据通信态) – 发送FIN – FIN_AIT_1 – 接收ACK – FIN WAIT 2 (半关闭)

–接收对端发送FIN – FIN_WAIT_2 (半关闭) --回发ACK – TIME, _WAIT (只有主动关闭连接方,会经历该状态)–等2ISL时长-- CLOSE

3.被动接收连接请求端:
CLOSE – LISTEN --接收SYN – LISTEN --发送ACK、SYN – SYN_RCVD --接收ACK – ESTABLISHED (数据通信态)

4.被动关闭连接请求端: ESTABLISHED (数据通信态) – 接收FIN – ESTABLISHED (数据通信态) – 发送ACK-- CLOSE_WAIT (说明对端[主动关闭连接端]处于半关闭状态) – 发送FIN – LAST_ACK --接收ACK – CLOSE

总结

time_wait存在的意义:
1.可靠的终止 TCP 连接。
2.保证让迟来的 TCP 报文有足够的时间被识别并被丢弃。(特指服务器主动关闭时的情况)

在 Linux 系统上,一个 TCP 端口不能被同时打开多次(两次及以上)。当一个 TCP 连接处于 TIME_WAIT 状态时,我们将无法立即使用该连接占用着的端口来建立一个新连接。如果确实需要强制进程立即使用处于 TIME_WAIT 状态的连接所占用的端口,可以通过**setsockopt()**方法设置 socket 选项 SO_REUSEADDR 来完成。
在这里插入图片描述

你可能感兴趣的:(Linux,网络,linux,tcp/ip)