TCP/IP 协议栈

TCP/IP 标准

  • TCP/IP:Transmission Control Protocol/Internet Protocol 传输控制协议/因特网互联协议
  • TCP/IP是一个协议栈,由众多的协议组成。TCP和ip是最重要的两个协议,所以用来作为协议栈的名字。
  • 最早的时候这个协议是在互联网上面使用,局域网里面使用的最广泛的是IPX、SPX协议。
    以太网工作在数据链路层和物理层

TCP/IP 分层

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

image

TCP/IP应用层

image

TCP/IP 工作逻辑

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

image

transport 层

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

TCP和UDP

tcp:

  • 可靠性高、性能低、
  • 面向连接、
  • 有序列的
  • 重传、
  • 半关闭(四次挥手)、
  • 确认机制(发一个包就确认一个包)、
  • 滑动窗口(根据网络情况控制数据包的发送,一次能处理多少数据包是变化的)、
  • 拥塞控制。
    主要用于:邮件通信、文件共享、下载

udp:

  • 高性能、
  • 可靠性差、
  • 无序列的
    主要用于:语音、视频通信
  • TCP:Transmission Control Protocol(传输控制协议)

    TCP特性

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

    TCP包头结构

    image

    • 第一行:源端口、目标端口(各占16位)
    • 第二行:序号,表示数据报文的编号(因为需要把文件拆成小包来传送,经过编号以后,目标设备接收到文件后按顺序进行组装)
    • 第三行:确认号,确认对方发过来的包已收,到
    • 第四行:
    数据偏移:表示头的长度。
    URG、ACK、PSH、RST、SYN、FIN:TCP的6个状态标记位,重点:ACK、SYN、FIN
    ACK:请求通信标记位
    SYN:消息确认标记位
    FIN:分手的状态标记位
    

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

    TCP协议PORT

    image

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

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

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

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

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

    TCP端口号通信过程

    三次握手

    image

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

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

    因为计算机完整的一次通信是有去有回。所以能进得来还出得去。所以是三次握手。
    对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:

    四次挥手

    image

    建立简介以后,状态就变成了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包头

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

    组成:

    • 源端口:
    • 目标端口:
    • udp的长度:
    • udp的校验和:
    • 数据部分:
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《TCP/IP 协议栈》
文章链接:https://zhuji.vsping.com/3471.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。