一、tcp/ip 三次握手與四次揮手如何從專業角度去說明它們之間的關系
https://blog.51cto.com/silencezone/1882436
二、redis 之主觀下線與客觀下線

答:
主觀下線: 節點之間會定期的執行ping/pong消息來證明節點之間的連通性,若節點一向節點二發送ping消息之後收到pong消息,那麼節點一将會更新最後一次與節點二的通信時間,若沒有收到pong消息,那麼節點一與節點二之間的連結将會斷開,之後節點一再次執行ping消息,若與節點二之間的最後通信時間超過指定的時間,那麼節點二将被節點一标記為主觀下線。
客觀下線:
答: 節點之間通信會攜帶一些必要的消息,其中就包含标記某節點為客觀下線狀态,節點中都包含了相關節點狀态的連結清單資訊,若節點的客觀下線的記錄超過半數,那麼嘗試執行客觀下線
嘗試客觀下線流程:
下線主節點之後,進行故障恢複:
首先是判斷該主節點的slave節點是否具有當主節點的資格,若該節點與主節點斷開連接配接超過一定的時間那麼就沒有資格
之後根據從節點與主節點之間的偏移量進行延遲選舉,保證偏移量最小的slave節點獲得更多的票
選出節點之後,從節點執行slave none one 變成主節點,從節點将主節點的槽移交給自己完成故障恢複。
三:nginx 主動檢查與被動檢查
主動健康檢查(需使用第三方子產品)
答:主動地健康檢查,nignx定時主動地去ping後端的服務清單,當發現某服務出現異常時,把該服務從健康清單中移除,當發現某服務恢複時,又能夠将該服務加回健康清單中。淘寶有一個開源的實作nginx_upstream_check_module子產品
被動檢查
答: Nginx隻有當有通路時後,才發起對後端節點探測。如果本次請求中,節點正好出現故障,Nginx依然将請求轉交給故障的節點,然後再轉交給健康的節點處理。是以不會影響到這次請求的正常進行。但是會影響效率,因為多了一次轉發,而且自帶子產品無法做到預警。
四、Nginx知識講解——location比對模式詳細講解 (一般比對優先級:精準比對 > 一般比對 > 正則比對)
1 location = patt {} 精準比對
精準比對優先級比一般比對大
2 location patt {} 一般比對
nginx會采用比對長度較長的一般比對的規則來使用
3 location ~ patt {} 正則比對
五、rewrite 指令
rewrite 指令 最後一項參數為flag标記,支援的flag 标記主要有以下幾種
last: 相當于apache裡的[l]标記,表示完成rewrite; 使用alias指定源:必須使用last
break: 本條規則比對完成後,終止比對,不再比對後面的規則
redirect:傳回302 臨時重定向,浏覽器位址會顯示跳轉後的url位址, 爬蟲不會更新url(因為是臨時)
permanent:傳回301 永久重定向,浏覽器位址會顯示跳轉後的url位址,爬蟲更新url
last和break 用來實作url重寫,浏覽器位址url位址不變,
redirect和permanent 用來實作url 跳轉
伺服器配置好redirect後,打開浏覽器會重定向你需要的網站,這個時候關閉網站是會直接報出無法連接配接的錯誤
但是permanent永久重定向定義以後,關閉nginx伺服器,這個時候在通路同樣會成功
這就是redirect跟permanent的差別
六、網絡傳輸 為啥要進行encode編碼
答:url轉義其實也隻是為了符合url的規範而已。因為在标準的url規範中中文和很多的字元是不允許出現在url中的
七:如何批量修改docker images 的tag
docker images | grep haproxy | sed 's/haproxy/192.168.61.121\/haproxy/g'| awk '{print "docker tag"" " $3" "$1":"$2}'|sh
八、tcp/ip 頭部包含哪些
1、源端口号 目标端口号
2、資訊長度
3、序列号
九、k8s 元件
Apiserver:所有服務的總入口。可以同時多個存在運作
etcd :存儲。如果etcd 放在叢集内部,将會自動滿足etcd高可用叢集。(1.15版本以後)
controller-manager:控制器,
scheduler:排程服務。當scheduler決定在哪個node上面運作pod後,将pod的配置發送給kubelet
controller-manager 與scheduler 一樣,若是多個節點在一個叢集中,那麼運作的節點隻會是一個,其他節點将自動進去休眠狀态。
以下兩個不需要高可用,因為這兩個是工作在每個節點之上運作的
kubelet:維持容器的生命周期,跟ci去互動(部署,維護)
Proxy:去實作負載的方式
十、k8s 中的pod 如何将業務對外通路
NodePort
十一、docker 鏡像 分層,分層的好處
Dockerfile 中的每一行都産生一個新層
下列代碼每一行都又一個獨立的id,而且下面産生的三層是隻讀的,一旦Image被運作時,會産生一個新層 container 層,這一層是可讀可寫的;
分層的優勢在于,兩個image可以共享一些層,降低了存儲的壓力。
1、複用,節省磁盤空間,相同的内容隻需加載一份到記憶體。
2、修改dockerfile之後,再次建構速度快
十二、COPY指令和ADD指令有哪些差別
COPY指令和ADD指令功能和使用方式類似。隻是COPY指令不會做自動解壓工作,而且也不支援從網絡擷取檔案
十三、k8s 控制器有哪些 (6種) 與Service類型
控制器
Deployment 聲明式更新控制器,用于釋出無狀态應用
ReplicaSet 副本集控制器,用于對Pod進行副本規模擴大或剪裁
StatefulSet 有狀态副本集,用于釋出有狀态應用
DaemonSet 在k8s叢集每一個Node上運作一個副本,用于釋出監控或日志收集類等應用
Job 運作一次性作業任務
CronJob 運作周期性作業任務
Service類型
ClusterIP預設,配置設定一個叢集内部可以通路的虛拟IP
NodePort在每個Node上配置設定一個端口作為外部通路入口
LoadBalancer工作在特定的Cloud Provider上,例如Google Cloud,AWS,OpenStack
ExternalName表示把叢集外部的服務引入到叢集内部中來,即實作了叢集内部pod和叢集外部的服務進行通信
十四、http協定原理
HTTP協定的作用原理包括四個步驟:
(1) 連接配接:Web浏覽器與Web伺服器建立連接配接,打開一個稱為socket(套接字)的虛拟檔案,此檔案的建立标志着連接配接建立成功。
(2) 請求:Web浏覽器通過socket向Web伺服器送出請求。HTTP的請求一般是GET或POST指令(POST用于FORM參數的傳遞)。GET指令的格式為: GET 路徑/檔案名 HTTP/1.0 檔案名指出所通路的檔案,HTTP/1.0指出Web浏覽器使用的HTTP版本。
(3) 應答:Web浏覽器送出請求後,通過HTTP協定傳送給Web伺服器。Web伺服器接到後,進行事務處理,處理結果又通過HTTP傳回給Web浏覽器,進而在Web浏覽器上顯示出所請求的頁面。
例:假設客戶機與www.mycompany.com:8080/mydir/index.html建立了連接配接,就會發送GET指令:GET /mydir/index.html HTTP/1.0。主機名為www.mycompany.com的Web伺服器從它的文檔空間中搜尋子目錄mydir的檔案index.html。如果找到該檔案,Web伺服器把該檔案内容傳送給相應的Web浏覽器。為了告知 Web浏覽器傳送内容的類型,Web伺服器首先傳送一些HTTP頭資訊,然後傳送具體内容(即HTTP體資訊),HTTP頭資訊和HTTP體資訊之間用一個空行分開。
常用的HTTP頭資訊有:
① HTTP 1.0 200 OK 這是Web伺服器應答的第一行,列出伺服器正在運作的HTTP版本号和應答代碼。代碼"200 OK"表示請求完成。
② MIME_Version:1.0 它訓示MIME類型的版本。
③ content_type:類型 這個頭資訊非常重要,它訓示HTTP體資訊的MIME類型。如:content_type:text/html訓示傳送的資料是HTML文檔。
④ content_length:長度值 它訓示HTTP體資訊的長度(位元組)。
(4) 關閉連接配接:當應答結束後,Web浏覽器與Web伺服器必須斷開,以保證其它Web浏覽器能夠與Web伺服器建立連接配接
十五、tcp/ip 資訊 頭部包含哪些
typedef struct _TCP_HEADER
{
short m_sSourPort; // 源端口号16bit
short m_sDestPort; // 目的端口号16bit
unsigned int m_uiSequNum; // 序列号32bit
unsigned int m_uiAcknowledgeNum; // 确認号32bit
short m_sHeaderLenAndFlag; // 前4位:TCP頭長度;中6位:保留;後6位:标志位
short m_sWindowSize; // 視窗大小16bit
short m_sCheckSum; // 檢驗和16bit
short m_surgentPointer; // 緊急資料偏移量16bit
}attribute((packed))TCP_HEADER, *PTCP_HEADER;
源端口号以及目的端口号:各占2個位元組,端口是傳輸層和應用層的服務接口,用于尋找發送端和接收端的程序,通過這兩個端口号和IP頭部的ip發送和接收号,可以唯一的确定一個連接配接。一般來講,通過端口号和IP位址,可以唯一确定一個TCP連接配接,在網絡程式設計中,通常被稱為一個socket接口。
序号:占4位元組,用來辨別從TCP發送端向TCP接收端發送的資料位元組流。
确認序号:占4位元組,包含發送确認的一端所期望收到的下一個序号,是以,确認序号應該是上次已經成功收到另一端資料位元組序号加1。
資料偏移:占4位,最大為1111即15個數字,一個代表4個位元組,用于指出TCP首部長度,若不存在選項,則這個值為20位元組,資料偏移的最大值為60位元組。
保留字段:占6位,值是确定的,暫時可忽略,值全為0
标志位:
URG(緊急): 為1時表明緊急指針字段有效
ACK(确認):為1時表明确認号字段有效
PSH(推送):為1時接收方應盡快将這個封包段交給應用層
RST(複位):為1時表明TCP連接配接出現故障必須重建連接配接
SYN(同步):在連接配接建立時用來同步序号
FIN(終止):為1時表明發送端資料發送完畢要求釋放連接配接
接收視窗:占2個位元組,用于流量控制和擁塞控制,表示目前接收緩沖區的大小。在計算機網絡中,通常是用接收方的接收能力的大小來控制發送方的資料發送量,這樣可以避免快主機緻使較慢主機的緩沖區溢出。TCP連接配接的一端根據緩沖區大小确定自己的接收視窗值,告訴對方,使對方可以确定發送資料的位元組數。
校驗和:占2個位元組,範圍包括首部和資料兩部分。檢查目前的TCP包是否有問題,有沒有損壞丢失
十六、什麼是事務
事務是一個最小的工作單元,不論成功與否都作為一個整體進行工作。
當事務失敗時,系統傳回到事務開始時的狀态。這個取消所有變化的過程稱為“復原”( rollback )。例如,如果一個事務成功更新了兩個表,在更新第三個表時失敗,則系統将兩次更新恢複原狀,并傳回到原始的狀态。
保持應用程式的完整性
十七、裝飾器運作過程
# 裝飾器
# 函數當參數傳,是為了給裡面的函數增加新功能(或者說加判斷)
# 從outer往裡走
# x 從目前層 開始尋找a, 找不到就往外尋找(從外不可以往裡找)
# 1、從 outter 開始先定義了a=1 | 執行的條件outer(foo)
# 2、傳回了一個inner的記憶體位址
# 3、inner加括号運作内層函數 inner加括号等于outer(foo)()
# 4 定義了x=a,print(x),運作函數foo(),最後傳回foo()函數的執行結果=print('foo')
十八、dns
說說UDP協定是在哪裡實用,tcp協定是在哪裡實用?
DNS中也有一個地方用到了TCP協定。那就是區域傳送!
DNS的規範規定了2種類型的DNS伺服器,一個叫主DNS伺服器,一個叫輔助DNS伺服器。在一個區中主DNS伺服器從自己本機的資料檔案中讀取該區的DNS資料資訊,而輔助DNS伺服器則從區的主DNS伺服器中讀取該區的DNS資料資訊。當一個輔助DNS伺服器啟動時,它需要與主DNS伺服器通信,并加載資料資訊,這就叫做區傳送(zone transfer)。 這種情況下,使用TCP協定。
為什麼域名解析用UDP協定?
因為UDP快啊!UDP的DNS協定隻要一個請求、一個應答就好了。而使用基于TCP的DNS協定要三次握手、發送資料以及應答、四次揮手。但是UDP協定傳輸内容不能超過512位元組。不過用戶端向DNS伺服器查詢域名,一般傳回的内容都不超過512位元組,用UDP傳輸即可。
針對第二問,為什麼區域傳送用TCP協定?
因為TCP協定可靠性好啊!你要從主DNS上複制内容啊,你用不可靠的UDP? 因為TCP協定傳輸的内容大啊,你用最大隻能傳512位元組的UDP協定?萬一同步的資料大于512位元組,你怎麼辦?