動機
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的大小
- seq, seq, …, wait, wait, …
- receive window
- 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
- slow start
- cwnd怎麼長
- Loss-based
- flow control
- 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
- RIP
- CIDR、netmask
- 中
- match
- IP 2 MAC & MAC 2 IP
- ARP
- ARP spoofing
- RARP
- ARP
- 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
- transport
- 安全協定
- AH
- 驗證header有沒有被改
- host 2 host
- ESP
- 把原pkt加密,再封裝
- 所以可以過NAT
- network 2 network
- AH
- 加密演算法
- 封包模式
- IPsec的參數
- PKI
- 公私鑰
- 驗證身分用
- SA
- 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
->
- SYN
- slow start & rwnd…
- 3 handshake
- 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
- FIN
- 4 close
explain
- DDoS
- 目的
- 利用大量的互聯網流量使目標伺服器或其周圍的基礎設施不堪重負,從而阻斷目標伺服器、服務或網路的正常流量
- 跡象
- 大量流量 from
- 同一ip, 同一ip範圍
- 單一行為特徵(例如設備類型、地理位置或 Web 瀏覽器版本)的用戶
- 對單一頁面或端點的請求
- 奇怪的流量模式,如在非正常時段激增,或不自然的模式
- 大量流量 from
- 攻擊方式
- level 7
- HTTP 洪水: req同一個網頁
- DNS放大: 假的sip去dns query
- level 4
- SYN 洪水: 假的sip去建連線
- level 3
- ping of death
- 在當時,大部分電腦無法處理大於IPv4最大封包大小(65,535位元組)的ping封包。
- 因此發送這樣大小的ping可以令目標電腦崩潰。
- buffer overflow
- ping of death
- level 7
- 防禦手法
- 黑洞路由
- 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
- 如果把seesion共用,就能
- application load balancer (from aws)
- level 3
- 自動分配新進來的請求要導到哪一台 Server
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
- 5 -> 3
醫生給了患者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
- P先生:“我不知道這張牌。”
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