jjzjj

TCP/IP 协议栈

背对背依靠 2023-03-28 原文

TCP/IP 标准

  • TCP/IP:Transmission Control Protocol/Internet Protocol 传输控制协议/因特网互联协议

  • TCP/IP是一个协议栈,由众多的协议组成。TCP和ip是最重要的两个协议,所以用来作为协议栈的名字。

  • 最早的时候这个协议是在互联网上面使用,局域网里面使用的最广泛的是IPX、SPX协议。
    以太网工作在数据链路层和物理层

TCP/IP 分层

  TCP/IP定义了四层:网络接口层、互联网层、传输层、应用层。简化了OSI的分层

TCP/IP应用层

TCP/IP 工作逻辑

数据包发送的时候,需要添加每层的头,对方收到之后再进行解封装。

transport 层

传输层的功能由两个协议实现:tcp和udp。可以实现可靠和快速通信。

TCP和UDP

tcp:

  • 可靠性高、性能低、

  • 面向连接、

  • 有序列的

  • 重传、

  • 半关闭(四次挥手)、

  • 确认机制(发一个包就确认一个包)、

  • 滑动窗口(根据网络情况控制数据包的发送,一次能处理多少数据包是变化的)、

  • 拥塞控制。
    主要用于:邮件通信、文件共享、下载

udp:

  • 高性能、

  • 可靠性差、

  • 无序列的
    主要用于:语音、视频通信

TCP:Transmission Control Protocol(传输控制协议)

TCP特性

  传输层协议、确认机制、全双工、面向连接

TCP包头结构

  • 第一行:源端口、目标端口(各占16位)

  • 第二行:序号,表示数据报文的编号(因为需要把文件拆成小包来传送,经过编号以后,目标设备接收到文件后按顺序进行组装)

  • 第三行:确认号,确认对方发过来的包已收,到

  • 第四行:

数据偏移:表示头的长度。
URG、ACK、PSH、RST、SYN、FIN:TCP的6个状态标记位,重点:ACK、SYN、FIN
ACK:请求通信标记位
SYN:消息确认标记位
FIN:分手的状态标记位

一般源端口是随机的,目标端口是约定俗称的。
linux列出常用应用的端口号: cat /etc/service

TCP协议PORT

  通过Ip地址可以找到对应的设备,但是设备上的通信应用不止一个,为了区分指定的应用程序,所以采用端口号来区分,每个应用程序都有一个唯一的端口号(应用程序的唯一标识)。
端口号范围:0--65536
0-1023:是给重要的服务使用的,已经分配出去了的。其他端口随意使用

范例:linux查看目前服务使用的端口

ss -ntl  #n:不解析服务名称,已数字方式显示端口号  t:tcp l:显示本地打开的所有端口

范例:查看某个端口是那个应用程序在使用

方法一: ss -ntlp  #(p:显示使用套接字的进程和进程标号)

方法二: lsof -i :端口号

TCP端口号通信过程

三次握手

面向连接的过程就叫做三次握手:

为什么需要三次握手,而不是两次握手?

  因为计算机完整的一次通信是有去有回。所以能进得来还出得去。所以是三次握手。
对A:需要又去有回,B也同样。

具体实现:(三步 A和B都需要有去有回)

A的通信:
  1. 客户端发送请求(去):SYN标记为置为1(请求通信),其他为0,并且记录当前包的序号(seq=x)。
  2. 服务器回应请求(回):SYN=1(请求通信),ACK=1(确认客户端发送过来的信息),当前数据包编号(seq=y),ack=x+1(数据包的确认号,告诉对方我希望你下次发x+1,变相说明了收到了x这个编号的包)
B的通信:
  1. 回:ACK=1,其他为0。seq=x+1(因为x上面已经发了,这次就发x+1),ack=y+1(说明了y包收到了,希望下次你发y+1)

状态

客户端:

  • CLOSED:从断开连接的状态发起连接请求,发送请求以后无论对方是否收到,立即进入到SYN-SENT状态。

  • SYN-SENT:回应服务器的请求以后,从当前状态立即进入到ESTAB状态。

  • ESTAB-LISHED:

服务器:

  • CLOSED:断开连接的状态

  • LISTEN:服务器端打开,监听某个服务的端口。回复客户端的请求以后,就从该状态切换为RVCD状态

  • SYN-RCVD:收到了客户端的请求后,也立即进去ESTAB状态。

  • ESTAB-LISHED:

四次挥手

建立简介以后,状态就变成了ESTAB这个状态。

流程:(理想状态)

  1. 客户端向服务器段发送分手请求(FIN=1,FIN是finsh的缩写),并且发送当前数据包的编号(seq=u)。

  2. 对方收到以后立即回复确认信息,ACK=1,seq=v,ack=u+1 -- 表示发送过来的分手请求已经收到了
    到目前位置只实现了客户端不想和服务器通信了,但是服务器还是可以和客户端通信的。(若数据还未发送完,就继续把数据传送完成)-- 数据单向传输

  3. 当服务器决定好要和客户端分手以后,服务器主动提出分手(FIN=1),ACK=1,seq=w,ack=u+1

  4. 客户端收到以后立即确认。ACK=1,seq=xx,ack=w+1(确认号)

状态:

客户端:

  • ESTAB-LISHED:刚开始大家是建立连接的,需要断开连接就发起分手请求,一旦发送了这个请求,就立刻进去WAIT-1这个状态。

  • FIN-WAIT-1:一旦收到服务器发送过来的请求,就进入WAIT-2这个状态

  • FIN-WAIT-2:收到服务器的分手请求,从当前状态进入WAIT状态。然后再发请求过去

  • TIME-WAIT:发送确认请求以后,需要等待一段时间(因为网络复杂,为了确保服务器发送分手数据包之前的数据都能稳妥到达)才进入CLOSED状态。

  • CLOSED:

服务器:

  • ESTAB-LISHED:收到客户端发送的分手请求以后,立刻回应。就从当前状态变成了CLOSED-WAIT状态。

  • CLOSED-WAIT:这边没什么数据要发了,就发送分手请求,然后进入了LST-ACK这个状态。

  • LAST-ACK:收到分手请求,进入断开连接这个状态。

  • CLOSED:

范例:linux查看连接的状态

#进程与套接字关系
√ 进程类似房子,套接字是进程的门。

√ 进程通过套接字在网络上发送和接收报文。

√ 发送进程:把报文推出门(套接字)。

√ 传送报文:通过下面网络把报文传送到目的进程门口。

√ 接收进程:通过其门(套接字)接收报文。
ss -nta #-a:显示所有套接字,套接字就是进程的接口

#linux的抓包工具:tcpdump
#windows的抓包工具:wireshark
#linux抓包工具的使用:
tcpdump -i 网卡名  -nn port 22    #-nn port 22:以数字的方式抓指定端口号的包

TCP重传机制

丢包或者网络不通,它会自动一次一次地进行尝试。

与TCP超时重传相关的两个内核参数;

/proc/sys/net/ipv4/tcp_retries1 #指定TCP最少执行的重传次数,默认值是 3
/proc/sys/net/ipv4/tcp_retries2 #指定TCP最多可以执行的重传次数,默认值 15(一般对应13~30min)

UDP:User Datagram Protocol

UDP的特性:

可靠性差(没有建立连接的过程)、性能高。
udp协议使用较少,只用语音视频等使用udp协议。互联网大部分应用使用的都是tcp协议

UDP包头


  包头组成比tcp的包头更简单。因为tcp和udp是独立的两个协议,所以就算tcp和udp同时使用一个相同的端口也是不会冲突的。

组成:

  • 源端口:

  • 目标端口:

  • udp的长度:

  • udp的校验和:

  • 数据部分:

有关TCP/IP 协议栈的更多相关文章

  1. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  2. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  3. ruby - 在 TCPServer (Ruby) 中,我如何从客户端获取 IP/MAC? - 2

    我想在Ruby的TCPServer中获取客户端的IP地址。以及(如果可能的话)MAC地址。例如,Ruby中的时间服务器,请参阅评论。tcpserver=TCPServer.new("",80)iftcpserverputs"Listening"loopdosocket=tcpserver.acceptifsocketThread.newdoputs"Connectedfrom"+#HERE!HowcanigettheIPAddressfromtheclient?socket.write(Time.now.to_s)socket.closeendendendend非常感谢!

  4. ruby - HTTP POST 上的 SSL 错误(未知协议(protocol)) - 2

    尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify

  5. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  6. ruby - 没有 nginx 的 Puma - 同一 IP 上的多个 ruby​​ 应用程序 :PORT - 2

    Nginx在生产中的重要性通常基于它为慢速客户端提供服务的能力;在RESTfulAPI的设置中,它似乎是生产堆栈的一个不必要的层,尤其是Puma(不像广泛使用的unicorn可以处理nginx工作)。Pumacanallowmultipleslowclientstoconnectwithoutrequiringaworkertobeblockedontherequesttransaction.Becauseofthis,Pumahandlesslowclientsgracefully.HerokurecommendsPumaforuseinscenarioswhereyouexpect

  7. 网络实验之RIPV2协议(一) - 2

    一、RIPV2协议简介  RIP(RoutingInformationProtocol)路由协议是一种相对古老,在小型以及同介质网络中得到了广泛应用的一种路由协议。RIP采用距离向量算法,是一种距离向量协议。RIP-1是有类别路由协议(ClassfulRoutingProtocol),它只支持以广播方式发布协议报文。RIP-1的协议报文无法携带掩码信息,它只能识别A、B、C类这样的自然网段的路由,因此RIP-1不支持非连续子网(DiscontiguousSubnet)。RIP-2是一种无类别路由协议(ClasslessRoutingProtocol),支持路由标记,在路由策略中可根据路由标记对

  8. Java IP归属地查询(离线方式+在线方式,内附查询IP方法) - 2

    一、离线方式1.1.下载ip2region.xdbGitHub项目地址:https://github.com/lionsoul2014/ip2region我们首先需要下载一个ip2region.xdb的文件下载地址:https://github.com/lionsoul2014/ip2region/blob/master/data/ip2region.xdb打开后点击如图的Download图标即可下载。下载完成后,需要将该文件放到我们的项目中。ps:我是直接放到服务器的,因为放在项目的资源文件夹下,当我们调试的时候使用JavaSpring自带的工具去获取该文件的绝对路径时,没有任何问题,能够正

  9. IP数据报格式 - 2

    1、报文格式前几篇总结过较多网络层的知识,ARP,ip地址、子网掩码等等。这次总结一下IP数据报的报文格式IP数据报的格式能够说明IP协议都具有什么功能。在TCP/IP的标准中,各种数据格式常常以32位(4字节)为单位来描述的。wireshark中IP数据报文呈现一个IP数据报文由首部和数据两部分组成。首部的前一部分是固定长度,共20字节。是所有IP数据报文必须具有的。在首部的固定部分的后面是一些可选字段,其长度可变。2、首部个字段意义  1、版本占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。版本号为6(即IPv6)  2、首部

  10. 计算机网络笔记:TCP三次握手和四次挥手过程 - 2

    TCP是面向连接的协议,连接的建立和释放是每一次面向连接的通信中必不可少的过程。TCP连接的管理就是使连接的建立和释放都能正常地进行。三次握手TCP连接的建立—三次握手建立TCP连接①若主机A中运行了一个客户进程,当它需要主机B的服务时,就发起TCP连接请求,并在所发送的分段中用SYN=1表示连接请求,并产生一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x。主机B收到A的连接请求报文,就完成了第一次握手。客户端发送SYN=1表示连接请求客户端发送一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x②主机B如果同意建立连接,则向主机A发送确认报

随机推荐