网络--TCP/IP

2023-11-08

TCP/IP 是供已连接因特网的计算机进行通信的通信协议

在 TCP/IP 内部

TCP/IP不是一个协议,而是一个协议族的统称。包含一系列用于处理数据通信的协议:
  • TCP (传输控制协议) - 应用程序之间通信
  • UDP (用户数据包协议) - 应用程序之间的简单通信
  • IP (网际协议) - 计算机之间的通信
  • ICMP (因特网消息控制协议) - 针对错误和状态
  • DHCP (动态主机配置协议) - 针对动态寻址
网络层


IP 是无连接的

IP 用于计算机之间的通信。
IP 是无连接的通信协议。它不会占用两个正在通信的计算机之间的通信线路。这样,IP 就降低了对网络线路的需求。每条线可以同时满足许多不同的计算机之间的通信需要。
通过 IP,消息(或者其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送。
IP 负责将每个包路由至它的目的地。

IP地址

每个计算机必须有一个 IP 地址才能够连入因特网。
每个 IP 包必须有一个地址才能够发送到另一台计算机。
TCP/IP 使用 4 个数字来为计算机编址。每个计算机必须有一个唯一的 4 个数字的地址。
数字在 0 到 255 之间,并由点号隔开,像这样:192.168.1.60
IP是网络层的地址,而网络层的出现目的之一就是屏蔽底层硬件的差异化,也就是在LAN上,到底用什么样的方式来找到目标主机并发送消息,IP是不管的。

域名

12 个阿拉伯数字很难记忆。使用一个名称更容易。
用于 TCP/IP 地址的名字被称为域名。 www.baidu.com 就是一个域名。
当你键入一个像 www.baidu.com  这样的域名,域名会被一种 DNS 程序翻译为数字。
在全世界,数量庞大的 DNS 服务器被连入因特网。DNS 服务器负责将域名翻译为 TCP/IP 地址,同时负责使用新的域名信息更新彼此的系统。
当一个新的域名连同其 TCP/IP 地址一同注册后,全世界的 DNS 服务器都会对此信息进行更新。
传输层

    TCP 使用固定的连接

TCP 用于应用程序之间的通信。
当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。
这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。
UDP 和 TCP 很相似,但是更简单,同时可靠性低于 TCP。
    数据进入协议栈时的封装过程:
        数据在发送端和接收端的封装和解包顺序:
TCP建立连接三次握手和释放连接四次握手
第一次握手
客户端向服务端发送连接请求报文段。该报文段的头部中SYN=1,ACK=0,seq=x。请求发送后,客户端便进入SYN-SENT状态。
  • PS1:SYN=1,ACK=0表示该报文段为连接请求报文。
  • PS2:x为本次TCP通信的字节流的初始序号。
    TCP规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号。
第二次握手
服务端收到连接请求报文段后,如果同意连接,则会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。
该应答发送完成后便进入SYN-RCVD状态。
  • PS1:SYN=1,ACK=1表示该报文段为连接同意的应答报文。
  • PS2:seq=y表示服务端作为发送者时,发送字节流的初始序号。
  • PS3:ack=x+1表示服务端希望下一个数据报发送序号从x+1开始的字节。
第三次握手
当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。
该报文段的头部为:ACK=1,seq=x+1,ack=y+1。
客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!
简单说,让双方都证实对方能发收。
知道对方能收是因为收到对方的因为收到而发的回应。
具体:
1:A发,B收, B知道A能发
2:B发,A收, A知道B能发收
3:A发,B收, B知道A能收
为什么需要第三次握手?
        还要再发送一次确认是为了,防止已失效的连接请求报文段突然又传到了B,因而产生错误。
已失效的报文段:正常情况下:A发出连接请求,但因为丢失了,故而不能收到B的确认。于是A重新发出请求,然后收到确认,建立连接,数据传输完毕后,释放连接,A发了2个,一个丢掉,一个到达,没有“已失效的报文段”
        但是,某种情况下,A的第一个请求在某个节点滞留了,延误到达,本来这是一个早已失效的报文段,但是在A发送第二个,并且得到B的回应,建立了连接以后,这个报文段竟然到达了,于是B就认为,A又发送了一个新的请求,于是发送确认报文段,同意建立连接,假若没有三次的握手,那么这个连接就建立起来了(有一个请求和一个回应),此时,A收到B的确认,但A知道自己并没有发送建立连接的请求,因为不会理睬B的这个确认,于是呢,A也不会发送任何数据,而B呢却以为新的连接建立了起来,一直等待A发送数据给自己,此时B的资源就被白白浪费了。但是采用三次握手的话,A就不发送确认,那么B由于收不到确认,也就知道并没有要求建立连接。
        简而言之:第三次握手,主机A发送一次确认是为了防止:如果客户端迟迟没有收到服务器返回的确认报文,这时他会放弃连接,重新启动一条连接请求;但问题是:服务器不知客户端没收到,所以他会收到两个连接请求,白白浪费了一条连接开销。

TCP四次挥手

TCP连接的释放一共需要四步,因此称为『四次挥手』。
我们知道,TCP连接是双向的,因此在四次挥手中,前两次挥手用于断开一个方向的连接,后两次挥手用于断开另一方向的连接。
第一次挥手
若A认为数据发送完成,则它需要向B发送连接释放请求。该请求只有报文头,头中携带的主要参数为:
FIN=1,seq=u。此时,A将进入FIN-WAIT-1状态。
* PS1:FIN=1表示该报文段是一个连接释放请求。
* PS2:seq=u,u-1是A向B发送的最后一个字节的序号。
第二次挥手
B收到连接释放请求后,会通知相应的应用程序,告诉它A向B这个方向的连接已经释放。此时B进入CLOSE-WAIT状态,并向A发送连接释放的应答,其报文头包含:
ACK=1,seq=v,ack=u+1。
* PS1:ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答。
* PS2:seq=v,v-1是B向A发送的最后一个字节的序号。
* PS3:ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节。
A收到该应答,进入FIN-WAIT-2状态,等待B发送连接释放请求。
第二次挥手完成后,A到B方向的连接已经释放,B不会再接收数据,A也不会再发送数据。但B到A方向的连接仍然存在,B可以继续向A发送数据。
第三次挥手
当B向A发完所有数据后,向A发送连接释放请求,请求头:FIN=1,ACK=1,seq=w,ack=u+1。B便进入LAST-ACK状态。
第四次挥手
A收到释放请求后,向B发送确认应答,此时A进入TIME-WAIT状态。该状态会持续2MSL时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态,撤销TCB。当B收到确认应答后,也便进入CLOSED状态,撤销TCB。
为什么A要先进入TIME-WAIT状态,等待2MSL时间后才进入CLOSED状态?
为了保证B能收到A的确认应答。
若A发完确认应答后直接进入CLOSED状态,那么如果该应答丢失,B等待超时后就会重新发送连接释放请求,但此时A已经关闭了,不会作出任何响应,因此B永远无法正常关闭。
    
什么时候应该使用TCP?
当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。
什么时候应该使用UDP?
当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络--TCP/IP 的相关文章

  • 任意宽度灰度BMP图像读写 V1

    一般BMP图像读写程序只能正确读写宽度为4的倍数的图像 而在图像处理领域所用到的图像宽度不一定满足4的倍数 我在一般BMP图像读写程序基础上进行了改进 使得程序可以读写任意宽度的灰度BMP图像 特分享给大家 希望能够给大家带来帮助 头文件
  • mysql版本5.5.*升级为5.7.*,遇到的问题和解决方法都来看看吧,最终升级成功~

    背景 由于项目比较老 用的数据库版本也是相当低 现在业务需求需要做数据同步 使用FlinkCDC的时候报数据库版本低 查询FlinkCDC要求的最低版本后果断升级mysql FlinkCDC对mysql最低版要求如下图 从 2 2 版本开始
  • 大疆云台和华为P30_超全,一篇文章搞清楚大疆Osmo三款产品区别!

    超全 一篇文章搞清楚大疆Osmo三款产品区别 2020 06 06 17 23 07 33点赞 179收藏 13评论 先说结论吧 Mobile 3适合日常用手机作为主力拍摄工具的人群 手机的拍摄能力以及符合你对画面的要求 另外你还可以接受每
  • code runner 中文使用指南

    Code Runner 用法 运行代码 使用快捷键 Ctrl Alt N 按F1然后选择 键入 Run Code 右键单击文本编辑器 然后在编辑器上下文菜单中单击 Run Code 命令 单击编辑器标题菜单中的 Run Code 按钮 单击
  • 车载毫米波雷达信号处理中的模糊问题仿真分析

    车载毫米波雷达信号处理中的模糊问题仿真分析 概述 车载毫米波雷达在现代汽车领域中扮演着重要的角色 用于实现自动驾驶 智能巡航控制和碰撞警报等功能 然而 在车载毫米波雷达信号处理中 存在各种模糊问题 这些问题可能会影响雷达系统的性能和准确性
  • MySQL数据库之DCL命令

    一 DCL命令 GRANT 授予访问权限 REVOKE 撤销访问权限 COMMIT 提交事务处理 ROLLBACK 事务处理回退 SAVEPOINT 设置保存点 LOCK 对数据库的特定部分进行锁定 查看用户权限 SHOW GRANTS F
  • vue学习笔记(三)

    1 vue开发存在SEO问题 前端开发采用vue开发后是单页面 单页面里面 前后端分离 渲染过程是js写的 在js调用接口返回数据之前 页面已经被打开了 实际上就是空白页面 这个时候右键点击查看源代码 实际上是都看不到内容的 对SEO不太有
  • 什么是节点光端机?总线型光端机有哪些优势?

    节点式光端机又称总线型光端机 其准确的定义是采用单 双纤链路式组网形式的图像传输系统 也被称为链路式光端机 那么 节点式光端机具体是什么呢 总线型光端机又有哪些优势呢 接下来我们就跟随飞畅科技的小编一起来详细了解下吧 什么是节点光端机 节点
  • Android动画+自定义Dialog实现闲鱼发布页面动态效果

    先来看一下效果图 一 新建一个项目DialogView 在layout文件夹下创建一个anmi的文件夹用于存放动画资源 1 首先创建进入Dialog和关闭Dialog时候的主题背景动画 进入Dialog时的动画 main go in xml
  • Ubuntu18 安装ssh

    1 安装ssh 在终端输入命令 sudo apt get install openssh server 2 查看SSH服务是否启动 输入命令 sudo ps e grep ssh
  • LRU算法

    http blog csdn net Ackarlix article details 1759793 http www cnblogs com changweihua archive 2012 05 13 2497903 html 文章一
  • STM32中栈、堆、全局区、常量区、代码区、RAM、ROM的分析

    STM32中栈 堆 全局区 常量区 代码区 RAM ROM的分析 1 堆 栈区 STM32中堆栈是为了存储不同信息而开辟的空间 具体对应于启动文件中的head和stack所定义的内存空间 STM32中 堆向高地址增长 栈向低地址增长 堆 是
  • 探索学习Qt

    探索学习Qt 版本说明 版本 作者 日期 备注 0 2 loon 2018 10 26 新增部分说明内容及总结计划 目录 文章目录 探索学习Qt 版本说明 目录 一 目的 二 Qt是什么 三 Qt示例和教程 1 探索Qt creator 2
  • 安装依赖时报错:npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve npm ERR! npm ERR! While resolving

    F study heima vueCode demo3 gt npm i axios S npm ERR code ERESOLVE npm ERR ERESOLVE could not resolve npm ERR npm ERR Wh
  • VR丨有哪些靠谱的VR开发工具之引擎篇

    转载 http www uisdc com vr tools design engine C7210 靠谱的工具都有哪些 在不同的学习阶段又该怎样进行合理的选择 本文将聚焦于这两个问题向你介绍一系列主流设计开发工具 包括引擎 3D建模 2D
  • CEEMDAN算法及其应用

    目录 前言 一 CEEMDAN 算法 1 算法原理 2 MATLAB程序 二 CEEMDAN 算法的应用 1 CEEMDAN 小波阈值联合去噪 2 CEEMDAN 小波包分析降噪 3 CEEMDAN 时频峰值滤波 结束语 参考文献 前言 针

随机推荐