TCP/IP协议栈学习

概述

  1. 传输层对传输行为进行控制,是一种逻辑连接(状态)。传输层(TCP)可以进行流量控制、拥塞控制、重传等。
  2. 网络层提供了主机到主机的通信,将传输层产生的数据包封装成分组数据包发送到目标主机,并提供了路由选择的能力。

TCP协议简介

  1. TCP是一个可靠的、面向连接的、基于字节流的、全双工的协议。
  2. TCP可靠的因素:校验和(数据完整和正确)、序列号(乱序和重复)、确认+重传。
  3. TCP是字节流协议,流是没有固定的报文边界。应用层可以用特殊字符标志数据结束或加入含有数据长度的头。
  4. TCP全双工通信,双方可以同时收发。

TCP协议首部字段

  1. 首部字段

    tcp首部

  2. 三次握手

    三次握手

  3. 序列号:
    通过算法,随机生成。不是从0开始。

  4. 确认号
    告知对方下一个期望接收的序列号,小于此序列号的所有字节已经收到。

  5. 关于ack

    • 不是所有的包都需要确认的。
    • 不是收到了数据包就立马需要确认的,可以延迟一会再确认。(delay ack)
    • 确认号永远是表示小于确认号的字节都已经收到。
  6. 窗口大小(window size)
    2字节,64k。但实际使用中可能不够,所以引入了窗口缩放(Window scale)的概念,来让窗口大小变大。

    windows size改大小

    计算后的window size为1025 * 256 = 262400

  7. mss最大报文段
    在tcp头部的选项字段内。

  8. 测试对方端口是否打开

    • telnet 192.168.20.10 5236
    • nc -v 192.168.20.10 9876
  9. 查看端口占用

    • netstat -ltnp | grep :22
    • lsof -n -P -i:22
    • ss -lntp | grep 22
  10. 什么情况分配临时端口:

    • 调用bind函数,但指定端口号为0。bind(0)
    • 没有调用bind,直接调用connect。
  11. TCP协议栈用全局的3个哈希表inet_hash

    • ehash:负责有名有姓的socket,即四元组(源、目的ip,源、目的端口)明确的socket,key由源地址、源端口、目标地址、目标端口组成;
    • bhash:负责端口分配,key是端口号,value是使用此端口的所有socket,一个socket可以同时在bhash和ehash中。
    • listening_hash:负责listen socket。
      在文件/net/inet_hashtables.hstruct inet_hashinfo
  12. connect 优先使用偶数端口号。偶数都用了的情况再分配奇数的端口号。

协议栈测试工具 packetdrill

先略

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
error: Content is protected !!内容保护!!