動機

OSI 7 layers

  • HTTP
    • keep-alive: 當客戶端傳送另一個請求時,它會使用同一個連接
    • Idempotence: 只有POST不是Idempotence
      • POST可以看成create資源
  • DNS
    • string 2 IP
    • iterative & recursive
  • DHCP
    • DHCP Discover
    • DHCP Offer
    • DHCP Request
    • DHCP ACK
  • transport
    • for application
    • TCP
      • (data header)
        • sport, dport
        • seq, ack
      • connection oriented
        • flow control
          • receive window
            • ack, ack, … , seq,seq …
          • sending window
            • seq, seq, …, wait, wait, …
              • wait, … (not in window)
            • 每個出去的pkt會有timer
              • timeout會retransmit
            • 控制sending window的長度就是flow control
            • receiver會通知rwnd的大小
        • error control
          • checksum
          • ack
            • 下一個要的seq
            • 確認號 為 所收到區段的 最後一個 位元組之 序號 + 1
            • Delayed ACK
              • 累積多一點ack
          • retransmit
            • delay, lost, damaged pkt
          • fast retransmit
            • receiver: out-of-order pkt
            • sender: 收到3個重複的ack
            • 不等timer直接retransmit
        • congestion control
          • Loss-based
            • 如果retransmit發生就調cwnd
            • bufferbloat
              • 大家的buffer都很大
              • pkt都待在queue
              • tcp以為沒有congestion
              • 狂丟pkt到網路上
          • sending window = min(RCV.rwnd, cwnd)
            • cwnd怎麼長
              • slow start
                • 指數成長
                • 總不能一直漲
                  • Slow Start Threshold
                  • packet loss
              • Congestion Avoidance
                • 線性的長
              • Fast Recovery
                • fast retransmit後到這個狀態
                • 等看是retransmit還是packet loss
      • split packet
    • UDP
  • IP
    • for WAN
    • (data header)
    • IP header不會變!!
      • match
          • 直接過去
        • 沒中
          • default gateway
        • how to match
          • CIDR、netmask
            • (IP_A & netmask) == (IP_B & netmask)
            • net addr & host addr
          • table from
            • RIP
              • broacast routing table for 30 secs
              • use metrics to decide to use which ip as dest
  • IP 2 MAC & MAC 2 IP
    • ARP
      • ARP spoofing
    • RARP
  • data link
    • for LAN
    • ethernet
      • (FCS data header)
      • CSMA/CD
        • 傳送特殊阻塞資訊並立即停止傳送資料
        • 固定時間(一開始是1 contention period times)內等待隨機的時間,再次傳送
        • 若依舊碰撞,則採用截斷二進位指數避退演算法進行傳送。即十次之內停止前一次「固定時間」的兩倍時間內隨機再發送
  • phy
    • cable

VPN

  • tunnel
    • tunnels are a method for transporting data across a network using protocols that are not supported by that network.
    • Tunneling works by encapsulating packets: wrapping packets inside of other packets.
  • IPsec
    • level 3
    • 2個東西
      • SA
        • IPsec的參數
          • 封包模式
            • transport
              • 用原本的header,加入驗證的資料
            • tunnel
              • 造一個新的header
          • 安全協定
            • AH
              • 驗證header有沒有被改
              • host 2 host
            • ESP
              • 把原pkt加密,再封裝
              • 所以可以過NAT
              • network 2 network
          • 加密演算法
      • PKI
        • 公私鑰
        • 驗證身分用
    • The purpose of IPsec is to give the remote computer direct access to the central network, making it a full member
  • TLS
    • level 4
    • 建連線時交換加密法與憑證,生成加密連線
    • Security is maintained by restricting access to only what’s needed.
    • portal mode
      • can only be used for web-based programs
    • tunnel mode
      • users can access any applications on the network, including ones that are not web based

scenario: Ping

  • 如果是string會先過DNS換ip
  • 生ICMP echo
  • 建連線,udp socket
  • 填sport與dport,包udp header
  • 填sip與dip,包ip header
  • dip放到routing table比,看要往哪一台機器丟
  • 找到dest,用arp換mac
  • 填smac與dmac,包eth header
  • 往下,到phy
  • router解eth header,確認是自己要收,驗FCS
  • router看ip header,對table,arp,包eth header
  • 終點就是反著做一次

scenario: Browser

  • 差在tcp
  • tcp start
    • 3 handshake
      • SYN ->
      • ACK與SYN <-
      • ACK ->
    • slow start & rwnd…
  • tcp end
    • 4 close
      • FIN ->
        • FIN_WAIT, CLOSE_WAIT
      • ACK <-
        • FIN_WAIT, CLOSE_WAIT
      • FIN <-
        • TIME_WAIT, LAST_ACK
      • ACK ->
        • (wait a while) CLOSED, CLOSED

explain

  • DDoS
    • 目的
      • 利用大量的互聯網流量使目標伺服器或其周圍的基礎設施不堪重負,從而阻斷目標伺服器、服務或網路的正常流量
    • 跡象
      • 大量流量 from
        • 同一ip, 同一ip範圍
        • 單一行為特徵(例如設備類型、地理位置或 Web 瀏覽器版本)的用戶
        • 對單一頁面或端點的請求
        • 奇怪的流量模式,如在非正常時段激增,或不自然的模式
    • 攻擊方式
      • level 7
        • HTTP 洪水: req同一個網頁
        • DNS放大: 假的sip去dns query
      • level 4
        • SYN 洪水: 假的sip去建連線
      • level 3
        • ping of death
          • 在當時,大部分電腦無法處理大於IPv4最大封包大小(65,535位元組)的ping封包。
          • 因此發送這樣大小的ping可以令目標電腦崩潰。
          • buffer overflow
    • 防禦手法
      • 黑洞路由
      • Rate Limiting
      • Web Application Firewall
        • 反向 Proxy,可使客戶在到達伺服器前通過 WAF
  • load balance
    • 自動分配新進來的請求要導到哪一台 Server
      • level 3
        • 分散到各個主機
        • ECMP
      • level 7
        • application load balancer (from aws)
          • 分散到group
        • persistence
          • 依據session打散到server
        • affinity
          • 如果把seesion共用,就能
            • 依據busy程度分配load

logic trick?? 邏輯問題

  • 找不同重量的球

    • 8顆球,其中1顆撞球比其他顆重了一點,幾次能找到
    • 兩次
      • 先將所有的撞球平分成三坨:3、3、2
      • 先比3,3,後面就很好想了
  • 一個5公升和3公升的瓶子,請量出4公升的水量

    • 5 -> 3
      • 5 剩下 2
    • 5(2) -> 3
      • 3 剩下 1的空間
    • 5 -> 3(2)
    • 最後是4
  • 醫生給了患者4顆共2種的藥,但他們彼此從外觀並不能分出差別,早上和晚上都得兩種各服一顆

    • 如果他沒按時吃或吃錯的話就會死,結果他不小心把藥搞混了,那他該怎麼做才能分辨哪個是正確的
    • 那就是把藥全部都切成一半,但是這一半不能再混在一起,早上把其中一半吃掉,晚上再吃另一半就好
  • 桌子的抽屜裏有如下16張撲克牌:

    • 紅心 A、Q、4
    • 黑桃 J、8、4、2、7、3
    • 梅花 K、Q、5、4、6
    • 方塊 A、5
    • 把這張牌的點數告訴P先生,把這張牌的花色告訴Q先生
      • P先生:“我不知道這張牌。”
        • 數字重複: A、Q、4、5
      • Q先生:“我知道你不知道這張牌。”
        • 花色中的數字都是重複的: 紅心、方塊
      • P先生:“現在我知道這張牌了。”
        • 數字唯一: 方塊5
      • Q先生:“我也知道了。
        • 花色中的數字唯一: 方塊5

DS implementation

  • circular queue
class CircularQueue():
    def __init__(self, size): # initializing the class
        self.size = size
         
        self.queue = [None for i in range(size)]
        self.front = self.rear = -1
 
    def enqueue(self, data):
        if ((self.rear + 1) % self.size == self.front):
            print(" Queue is Full\n")
             
        # condition for empty queue
        elif (self.front == -1):
            self.front = 0
            self.rear = 0
            self.queue[self.rear] = data
        else:
            self.rear = (self.rear + 1) % self.size
            self.queue[self.rear] = data
             
    def dequeue(self):
        if (self.front == -1): # condition for empty queue
            print ("Queue is Empty\n")
             
        # condition for only one element
        elif (self.front == self.rear):
            temp=self.queue[self.front]
            self.front = -1
            self.rear = -1
            return temp
        else:
            temp = self.queue[self.front]
            self.front = (self.front + 1) % self.size
            return temp
  • stack in linked list
    • push/pop在head
def push(head,val):
  ret = Node(val)
  ret.next = head
  return ret

def pop(head):
  if head:
    return [head.val, head.next]
  else:
    raise StopIteration

LC

  • remove duplicate from the linked list
  • validate binary search tree
  • top k frequen elements
  • reverse linked list
  • cross byte matching 的 pattern search
    • byte: kmp
    • bit: bitmask

mutil core process!!

  • atomic
  • cache coherency