【网络技术】TCP详解

1 TCP是什么 

TCP是Transmission Control Protocol的缩写,即传输控制协议。

TCP是一种面向连接的、可靠的、基于字节流的传输协议,是互联网通信协议TCP/IP中的一个重要组成部分。

2 三次握手

三次握手的过程可以用以下图示表示:

2.1 详细介绍 

TCP协议使用三次握手(Three-way handshake)来建立连接,三次握手的过程如下:

  1. 第一次握手(SYN):客户端向服务器发送一个连接请求报文段,报文段中包含SYN(同步序列号)标志位,并随机选择一个初始序列号(ISN)。

  2. 第二次握手(SYN/ACK):服务器接收到客户端的连接请求报文段后,向客户端发送确认报文段,报文段中包含SYN(同步序列号)和ACK(确认序列号)标志位,确认号为客户端的初始序列号+1,同时服务器也随机选择一个初始序列号。

  3. 第三次握手(ACK):客户端接收到服务器的确认报文段后,向服务器发送确认报文段,报文段中包含ACK(确认序列号)标志位和确认号,确认号为服务器的初始序列号+1。

需要注意,在三次握手的过程中,客户端和服务器都会发送自己的初始序列号,这是为了避免网络中存在已经失效的连接请求报文段而产生的错误。

如果在建立连接的过程中有任何一次握手失败,TCP协议会重新发起连接请求,直到连接建立成功或超时。

 注意,三次握手建立连接时,客户端和服务器均需要发送和接收数据,因此在握手过程中需要交换关键信息以确保连接的可靠性和正确性。

通过三次握手,TCP协议可以确保连接建立成功后,双方之间可以正常地传输数据。

2.2 思考

2.2.1 为什么需要三次握手

TCP协议需要通过三次握手来建立连接,主要是为了确保连接的可靠性和稳定性,防止网络中出现问题导致数据传输失败或者数据错误。

具体来说,TCP协议需要进行三次握手的原因包括:

  1. 确认双方的通信能力:通过三次握手可以确保客户端和服务器之间的通信能力是正常的,能够进行数据传输。在握手过程中,客户端和服务器会交换一些关键信息,例如初始序列号、确认号等,以确保双方的通信能力和协议支持是一致的。

  2. 避免过期连接的产生:三次握手可以避免网络上存在已经失效的连接请求报文段而产生的错误。在第一次握手和第二次握手中,客户端和服务器都会发送自己的初始序列号,这是为了避免网络中存在已经失效的连接请求报文段而产生的错误。

  3. 防止网络攻击:三次握手可以一定程度上防止网络攻击,例如SYN洪水攻击。在SYN洪水攻击中,攻击者会伪造大量的TCP连接请求报文段,从而占用服务器的资源和带宽。通过三次握手,可以确保每个连接请求都是合法的,从而防止这种攻击的发生。

所以说,通过三次握手可以确保TCP连接的可靠性、稳定性和安全性,保证数据能够正确地传输,并防止网络攻击的发生。

3 四次挥手

四次挥手的过程可以用以下图示表示:

3.1 详细介绍 

四次挥手详细介绍

TCP协议使用四次挥手(Four-way handshake)来关闭连接,四次挥手的过程如下:

  1. 第一次挥手(FIN):客户端向服务器发送一个FIN(结束)报文段,请求关闭连接。客户端不再发送数据,但仍能接收服务器端的数据。

  2. 第二次挥手(ACK):服务器接收到客户端的FIN报文段后,发送一个ACK(确认)报文段作为响应,告诉客户端已经收到关闭请求。

  3. 第三次挥手(FIN):服务器向客户端发送一个FIN报文段,请求关闭连接。服务器不再发送数据,但仍能接收从客户端发来的数据。

  4. 第四次挥手(ACK):客户端接收到服务器发送的FIN报文段后,发送一个ACK报文段作为响应,告诉服务器已经收到关闭请求。此时,客户端和服务器之间的连接已经正式关闭。

在四次挥手的过程中,客户端和服务器都需要发送FIN报文段和ACK报文段。

这是因为TCP协议是全双工的,客户端和服务器都可以发送数据和请求关闭连接。

在关闭连接时,需要双方都发送FIN和ACK报文段,以确保连接被成功关闭。

四次挥手的过程中可能会出现一些问题,例如连接超时、数据包丢失等,导致连接无法正常关闭。

因此,在实际应用中,需要注意对连接的超时时间、重传机制、流量控制等方面进行合理的配置和优化,以确保连接能够正常关闭,避免资源的浪费和网络拥塞的发生。

4 TCP实现形式

TCP(传输控制协议)是一种面向连接的、可靠的、基于流的传输协议,常用于网络通信中。

4.1 形式介绍 

TCP有以下几种实现形式:

  1. 原生TCP:原生TCP是指通过系统内核提供的TCP协议栈进行通信,通常使用Socket接口进行编程实现。

  2. TLS:TLS(Transport Layer Security)是一种基于TCP协议的安全传输协议,可以在TCP协议之上提供加密和身份验证等安全功能,常用于保护Web应用程序和电子邮件等敏感数据的传输。

  3. HTTP协议:HTTP(HyperText Transfer Protocol)是一种基于TCP协议的应用层协议,常用于Web应用程序中进行数据传输。HTTP协议基于TCP协议的可靠传输特性,但不是TCP协议的直接实现形式。

  4. SCTP:SCTP(Stream Control Transmission Protocol)是一种基于TCP协议的可靠传输协议,支持多流复用和多路复用等功能,可以提高网络传输的效率和可靠性。

  5. QUIC:QUIC(Quick UDP Internet Connections)是一种基于UDP协议的可靠传输协议,可以在低延迟和高带宽网络环境下提供更快的传输速度和更好的用户体验。

不同的TCP实现形式在功能和性能上有所不同,需要根据具体需求进行选择和优化。

例如,在需要保护数据传输安全性的场景下可以使用TLS协议,需要提高网络传输效率和可靠性的场景下可以使用SCTP协议或QUIC协议等。

4.2 代码示例

下面以Python语言为例,给出一个简单的TCP服务器和客户端示例:

4.2.1 TCP服务器端示例

import socket# 创建TCP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定地址和端口号
server_socket.bind(('localhost', 8888))# 监听连接请求
server_socket.listen(5)# 等待客户端连接
print('等待客户端连接...')
client_socket, client_address = server_socket.accept()
print('客户端已连接:', client_address)# 接收客户端发送的数据
data = client_socket.recv(1024)
print('接收到客户端数据:', data)# 发送数据给客户端
client_socket.sendall(b'Hello, client!')# 关闭连接
client_socket.close()
server_socket.close()

4.2.2 TCP客户端示例

import socket# 创建TCP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接服务器
client_socket.connect(('localhost', 8888))
print('已连接服务器!')# 发送数据给服务器
client_socket.sendall(b'Hello, server!')# 接收服务器发送的数据
data = client_socket.recv(1024)
print('接收到服务器数据:', data)# 关闭连接
client_socket.close()

5 总结

TCP协议是一种面向连接的、可靠的、基于字节流的传输协议,提供了可靠的数据传输、流量控制、拥塞控制、数据重传、数据分段和序列号等功能,是互联网上广泛使用的传输协议之一。

TCP协议提供了可靠的数据传输、流量控制、拥塞控制、数据重传、数据分段和序列号等功能。

在TCP协议进行数据传输之前,需要先建立TCP连接,建立连接的过程中,客户端和服务器进行三次握手(SYN、SYN-ACK、ACK),以确保双方都能够接收和发送数据。

TCP协议通过使用ACK确认机制和序列号机制,保证传输的数据不会丢失、重复或者失序。每个数据包都会被确认,并且数据包的传输顺序不会发生错误。

此外,TCP协议还提供了流量控制、拥塞控制、数据重传、数据分段和序列号等功能,以满足不同的传输需求。

 6 图书推荐

图书名称:

  1. 《TCP/IP详解 卷1:协议(原书第2版)》
  2. 《TCP/IP详解 卷2:实现》
  3. 《TCP/IP详解 卷3:TCP事务协议、HTTP、NNTP和UNIX域协议》

三本书可任选一本 

 

图书介绍

已故网络专家、著名技术作家W. Richard Stevens的传世之作,内容详尽且极具权威,被誉为TCP/IP领域的不朽名著。无论你是初学者还是功底深厚的网络领域高手,本书都是案头必备,将帮助你更深入和直观地理解整个协议族,构建更好的应用和运行更可靠、更高效的网络。

先睹为快:TCP详解

 参与方式 

图书数量:本次送出 4 本   !!!⭐️⭐️⭐️
活动时间:截止到 2023-07-10 12:00:00

抽奖方式:

  • 在新星计划【云原生之k8s入门】方向参加的小伙伴中随机抽取

参与方式:

  • 对文章进行:点赞、收藏
  • 参加新星计划【云原生之k8s入门】,并提交任务。
  • 活动参与链接:https://bbs.csdn.net/topics/616338210

中奖名单 

🍓🍓 获奖名单🍓🍓

 中奖名单:请关注博主动态

名单公布时间:2023-07-10 下午

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/79624.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《算法竞赛·快冲300题》每日一题:“连接草坪(II)”

《算法竞赛快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 连…

[Docker实现测试部署CI/CD----自由风格的CI操作[中间架构](4)]

目录 10、自由风格的CI操作(中间架构)中间架构图创建web项目Idea提交项目到远程仓库提交代码到本地库提交代码到远程库从jenkins拉取代码新建任务jenkins集成gitlab立即构建 将项目打为jar包Jenkins 配置 mvn 命令重新构建 代码质量检测jenkins将代码推送…

HTTP(超文本传输协议)学习

关于HTTP补学 一、HTTP能干什么 通过下图能够直观的看出:“交换数据 ” 二、HTTP请求例子 一个 HTTP 方法,通常是由一个动词,像 GET、POST 等,或者一个名词,像 OPTIONS、HEAD 等,来定义客户端执行的动作。…

小学语文思维导图:如何写一篇好的作文

大家都知道,思维导图是一款非常高效的工具。我们利用思维导图不仅可以做读书笔记、还可以运用到很多具体细分的场景。今天我们就“如何利用思维导图写好一篇作文”和大家进行分享。 思维导图在写作文的过程中,可以帮助我们整理思路。提高效率。将混乱的内…

【iOS安全】OpenSSH使用

安装OpenSSH 在 Cydia 中直接查找和安装 OpenSSH 使用OpenSSH http://orinchen.github.io/blog/2014/01/15/install-and-use-openssh-on-ios/ 保证PC和iPhone在同一网段下 查看iPhone的IP地址 ssh root10.168.xx.xx 口令默认是alpine 或者也可以使用XShell等集成终端

再次斩获第一,文心3.5霸榜国内大模型

目录 1 什么是文心一言?2 体验与文心一言对话3 文心3.5霸榜国内大模型 1 什么是文心一言? 文心一言是百度全新一代知识增强大语言模型,文心大模型家族的新成员,能够与人对话互动,回答问题,协助创作&#xf…

数据结构--单链表OJ题

上文回顾---单链表 这章将来做一些链表的相关题目。 目录 1.移除链表元素 2.反转链表 3.链表的中间结点 4.链表中的倒数第k个结点 5.合并两个有序链表 6.链表分割 7.链表的回文结构 8.相交链表 9.环形链表 ​编辑 10.环形链表II ​编辑 ​编辑 1.移除链表元素 思…

2023暑假牛客多校6- E.Sequence

题目描述 You have an array of elements . For each task, you have three integers . Ask whether you can find an array of integers satisfy: are the multiplies of 2 Specially, if , it should satisfy is the multiply of 2 We define . If possible, print…

Java课题笔记~ 动态SQL详解

一、动态 sql 是什么? 1、动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中,开发人员通常需要手动拼接 SQL 语句。根据不同的条件拼接 SQL 语句是一件极其痛苦的工作。 例如,拼接时要确保添加了必要的空格,还要…

cnvd通用型证书获取姿势

因为技术有限,只能挖挖不用脑子的漏洞,平时工作摸鱼的时候通过谷歌引擎引擎搜索找找有没有大点的公司有sql注入漏洞,找的方法就很简单,网站结尾加上’,有异常就测试看看,没有马上下一家,效率至上…

Day12-1-Webpack前端工程化开发

Webpack前端工程化 1 案例-webpack打包js文件 1 在index.html中编写代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><me…

20天学会rust(二)rust的基础语法篇

在第一节&#xff08;20天学rust&#xff08;一&#xff09;和rust say hi&#xff09;我们配置好了rust的环境&#xff0c;并且运行了一个简单的demo——practice-01&#xff0c;接下来我们将从示例入手&#xff0c;学习rust的基础语法。 首先来看下项目结构&#xff1a; 项目…

QtWebApp开发https服务器,完成客户端与服务器基于ssl的双向认证,纯代码操作

引言&#xff1a;所谓http协议&#xff0c;本质上也是基于TCP/IP上服务器与客户端请求和应答的标准&#xff0c;web开发中常用的http server有apache和nginx。Qt程序作为http client可以使用QNetworkAccessManager很方便的进行http相关的操作。Qt本身并没有http server相关的库…

zabbix监控mysql容器主从同步状态并告警钉钉/企业微信

前言&#xff1a;被监控的主机已经安装和配置mysql主从同步&#xff0c;和zabbix-agent插件。 mysql创建主从同步&#xff1a;http://t.csdn.cn/P4MYq centos安装zabbix-agent2&#xff1a;http://t.csdn.cn/fx74i mysql主从同步&#xff0c;主要监控这2个参数指标&#xf…

Maven-学习笔记

文章目录 1. Maven简介2.Maven安装和基础配置3.Maven基本使用4.Maven坐标介绍 1. Maven简介 概念 Maven是专门用于管理和构建Java项目的工具 主要功能有: 提供了一套标准化的项目结构提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;…

微信小程序中的全局数据共享(状态管理)使用介绍

开发工具&#xff1a;微信开发者工具Stable 1.06 一、状态管理简介 微信小程序全局状态是指可以在不同页面之间共享的数据或状态。 它可以存储用户的登录状态、个人信息、全局配置信息等。 二、安装MobX 1、安装NPM 在资源管理器的空白地方点右键&#xff0c;选择“在外部…

无涯教程-Perl - endhostent函数

描述 此函数告诉系统您不再希望使用gethostent从hosts文件读取条目。 语法 以下是此函数的简单语法- endhostent返回值 此函数不返回任何值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perlwhile( ($name, $aliases, $addrtype, $length, addrs)gethostent() ) …

5个可以创意灵感的AI绘画工具

当设计灵感耗尽&#xff0c;陷入创作瓶颈时&#xff0c;人工智能艺术生成器可能会为您提供新的启示。这些基于深度学习和发展“神经网络”的工具可以将输入的文本描述或图像转换成各种风格的艺术作品&#xff0c;并提供丰富的风格参数和材料库&#xff0c;让您可以自由调整和创…

【Linux】网络套接字知识点补足

目录 1 地址转换函数 1.1 字符串转in_addr的函数: 1.2 in_addr转字符串的函数: 1.3 关于inet_ntoa 2 TCP协议通讯流程 1 地址转换函数 本节只介绍基于IPv4的socket网络编程,sockaddr_in中的成员struct in_addr sin_addr表示32位 的IP 地址但是我们通常用点分十进制的字符串…

【Java split】split() 函数分割空字符串后数组长度为1的原因以及规避措施(105)

问题现象: import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class test06 {public static void main(String[] args) {// Java split()函数 分割空字符串长度为1的解释&#xff1b;String s2 "";String[] arr2 s2.split(&quo…