TCP IP 协议 - noonecare/linux GitHub Wiki

OSI 七层(四层) 模型(对于application ,presentation, session 三层的区别我分不清, 看 Eli the computer guy 的视频)

  • Application(应用层)

    • http, smtp, pop3, ssh, ftp, sftp, telnet, SNMP 等等属于 Application 层
  • Presentation(显示层)

    • TIFF,GIF,JPEG,PICT,ASCII,EBCDIC,encryption,MPEG,MIDI,HTML
  • Session(会话层)

    • RPC,SQL,NFS
  • transport(传输层)

    • tcp, udp 协议属于这一层。 tcp 协议有 windowing 操作,会把数据分成 packets, 然后把 packets 发送出去,收到 ack 之后,会接着发送 packets 直到发送完所有 packets 位置。udp 不关心 ack, 所以发送速度一般比 tcp 快。tcp 设计是考虑到网络连接可能不好;而 udp 认为网络连接很好。
  • internet(网络层)

    • IP, DNS, HDCP, NAT, Route, ICMP(ping) 等与域名 IP 相关的协议属于这一层, 子网划分属于网络层的问题

    • ARP(Address Resolution Protocol) 根据 IP 地址获取 Mac 的协议。ARP 给出的 Mac 可以伪造,称为 ARP欺骗

  • data link(连接层)

  • physical(物理层)

    • 硬件设备(比如 switch, hub 等)有没有连接好的问题,属于这一层

smbshare(?)

linux 操作指令

Linux 网络指令

DNS 解析

  • 输入一个域名,程序如何找到域名对应的 IP 的。
    • 程序首先到 /etc/hosts 中寻找,是否有记录 hostname ip 项,指明了 一个 hostname 对应某个 IP。
    • 如果没有找到就到 /etc/resolv.conf 中寻找 DNS 服务器,去 DNS 服务器中找这个 hostname 对应哪个 IP。
    • 如果还没有找到这个 hostname 的 IP, 报 DNS 失败的错误。

公网和私网

NAT(Network Address Translation)

  • NAT 为每个私有 IP 分配个公网 IP。
  • 一般私有IP:Host 会被分配成公共 IP 加 端口号 的形式。

NAT 分为 SNAT(source), DNAT(Destination), PNAT()

iptables

Network File System

nfs: 在 linux 虚拟机上 执行

mount -t nfs 10.200.200.57:/home/wangmeng /mnt/test_machine
  • TCP 为什么要三项握手,两向不行吗?(当年看书的时候,就想过这个问题,没想明白,后来给忘了,直到面试的时候,被人稳住)

如果使用两向握手会导致如下情形: client 向 server 发送了连接请求但是因为一些原因, 这个 syn packet 经过了很长时间才到达 server, 在它到达 server 之前, client 端的人早就等得不耐烦了,早早的就 close 了 connection。 如果采用两向握手, server 端收到 syn packet, 立马向 client 端发送 syn+ack package 于是连接在 server 端建立。但是 client 端不存在这个连接, client 也不可能在关闭这个连接,于是这个连接永远存在,浪费大量资源。

  • TCP 是如何关闭连接的?

DNS

  • /etc/hosts 文件记录了域名和IP 的对应
  • /etc/resolv.conf
    • nameserver 表示 DNS 服务器的 IP
    • search 举个例子 如果 search 的值为 com 那么DNS 在解析 github 域名或者 github.com 时,其实解析的都是 github.com。

对于常用的 linux 命令,可以使用 man 查看如何使用。比如 man grep。我没有想到的是对于常用的配置文件也可以这样查询。比如 man hosts, man resolv.conf 等。如果有那个配置文件,你不会使用不妨用 man 查查看。

抓包工具

  • fiddler
    • fiddler 是 127.0.0.1:8888 端口的代理服务器,如果设置浏览器的代理服务器为 127.0.0.1:8888 那么 fiddler 就可以侦听浏览器所有会话。fiddler 作为抓包工具最好地方是可以搜索,比如在窗口的左下角有 QUICKExec 。
  • tcpdump
    • tcpdump 侦听从有 packet, 这样会有很多很多的 packet, 所以 tcpdump 中有很多过滤 packet 的 options, 方便只查看你感兴趣的packet。
    • tcpdump 的过滤条件支持 and or not 的逻辑组合。
    • 不明白为什么 tcpdump 支持侦听从 host A(不是 localhost) 到 host B(不是 localhost)的 packet,
  • chrome
  • dd