TCP/IP 协议栈

TCP/IP 标准

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

TCP/IP 分层

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

TCP/IP 协议栈

TCP/IP 协议栈

TCP/IP应用层

TCP/IP 协议栈

TCP/IP 工作逻辑

在发送报文时,需要添加每一层的头部,对方收到后会将其解封。

[En]

When the packet is sent, the header of each layer needs to be added, and the other party will unencapsulate it after receiving it.

TCP/IP 协议栈

transport 层

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

TCP/IP 协议栈

TCP和UDP

tcp:

  • 可靠性高、性能低、
  • 面向连接、
  • 有序列的
  • 重传、
  • 半关闭(四次挥手)、
  • 确认机制(发包确认包),
    [En]

    confirmation mechanism (send a packet to confirm a package),*

  • 滑动窗口(根据网络情况控制数据包的传输,一次可以处理多少包),
    [En]

    sliding window (controlling the transmission of data packets according to the network situation, how many packets can be processed at a time),*

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

    Mainly used for: email communication, file sharing, download

udp:

  • 高性能、
  • 可靠性差、
  • 无序列的
    主要用于:语音和视频通信
    [En]

    Mainly used for: voice and video communication

TCP/IP 协议栈

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

TCP特性

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

[En]

Transport layer protocol, confirmation mechanism, full-duplex, connection-oriented

TCP包头结构

TCP/IP 协议栈
  • 第一行:源端口和目的端口(各16位)
    [En]

    first line: source port and destination port (16 bits each)*

  • 第二行:序列号,代表数据报文的编号(因为文件需要拆包发送,编号后,目标设备接收文件并按顺序组装)
    [En]

    the second line: serial number, which represents the number of the data message (because the file needs to be split into packets to send, and after numbering, the target device receives the file and assembles it sequentially)*

  • 第三行:确认号,确认对方寄来的包裹已收到,至
    [En]

    the third line: confirmation number, confirm that the package sent by the other party has been received, to*

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

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

TCP协议PORT

TCP/IP 协议栈

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

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

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

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

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

方法二: lsof -i :端口号

TCP端口号通信过程

三次握手

TCP/IP 协议栈

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

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

因为在计算机和计算机之间有一个完整的通信。这样你就可以进出了。所以这是三次握手。

[En]

Because there is a complete communication between the computer and the computer. So you can get in and out. So it’s a three-way handshake.

对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:

四次挥手

TCP/IP 协议栈

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

流程:(理想状态)

  1. 客户端向服务器段发送分手请求(FIN=1,FIN是finsh的缩写),并且发送当前数据包的编号(seq=u)。
  2. 对方收到以后立即回复确认信息,ACK=1,seq=v,ack=u+1 — 表示发送过来的分手请求已经收到了
    到目前为止,该位置只意识到客户端不想与服务器通信,但服务器仍然可以与客户端通信。(如果数据尚未发送,则继续传输数据)–单向数据传输
    [En]

    So far, the location has only realized that the client does not want to communicate with the server, but the server can still communicate with the client. (if the data has not yet been sent, continue to transfer the data)– one-way data transmission

  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重传机制

如果数据包丢失或网络不可用,它将自动反复尝试。

[En]

If the packet is lost or the network is not available, it will automatically try again and again.

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

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

UDP:User Datagram Protocol

UDP的特性:

可靠性差(无连接建立过程)和高性能。

[En]

Poor reliability (no connection establishment process) and high performance.

udp协议使用较少,只用语音视频等使用udp协议。互联网大部分应用使用的都是tcp协议

UDP包头

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

组成:

  • 源端口:
  • 目标端口:
  • udp的长度:
  • udp的校验和:
  • 数据部分:

Original: https://www.cnblogs.com/heyongshen/p/16455774.html
Author: 背对背依靠
Title: TCP/IP 协议栈

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/523173/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球