100 Continue:客戶端應當繼續發送請求。這個臨時響應是用來通知客戶端它的部分請求已經被服務器接收,且仍未被拒絕。客戶端應當繼續發送請求的剩餘部分,或者若是請求已經完成,忽略這個響應。服務器必須在請求完成後向客戶端發送一個最終響應。javascript
400 Bad Request:語義有誤,當前請求沒法被服務器理解。除非進行修改,不然客戶端不該該重複提交這個請求。請求參數有誤。html
401 Unauthorized:當前請求須要用戶驗證。該響應必須包含一個適用於被請求資源的 WWW-Authenticate 信息頭用以詢問用戶信息。客戶端能夠重複提交一個包含恰當的 Authorization 頭信息的請求。若是當前請求已經包含了 Authorization 證書,那麼401響應表明着服務器驗證已經拒絕了那些證書。若是401響應包含了與前一個響應相同的身份驗證詢問,且瀏覽器已經至少嘗試了一次驗證,那麼瀏覽器應當向用戶展現響應中包含的實體信息,由於這個實體信息中可能包含了相關診斷信息。參見RFC 2617。前端
403 Forbidden:服務器已經理解請求,可是拒絕執行它。與401響應不一樣的是,身份驗證並不能提供任何幫助,並且這個請求也不該該被重複提交。若是這不是一個 HEAD 請求,並且服務器但願可以講清楚爲什麼請求不能被執行,那麼就應該在實體內描述拒絕的緣由。固然服務器也能夠返回一個404響應,假如它不但願讓客戶端得到任何信息。html5
404 Not Found:請求失敗,請求所但願獲得的資源未被在服務器上發現。沒有信息可以告訴用戶這個情況究竟是暫時的仍是永久的。假如服務器知道狀況的話,應當使用410狀態碼來告知舊資源由於某些內部的配置機制問題,已經永久的不可用,並且沒有任何能夠跳轉的地址。404這個狀態碼被普遍應用於當服務器不想揭示到底爲什麼請求被拒絕或者沒有其餘適合的響應可用的狀況下。出現這個錯誤的最有可能的緣由是服務器端沒有這個頁面。java
405 Method Not Allowed:請求行中指定的請求方法不能被用於請求相應的資源。該響應必須返回一個Allow 頭信息用以表示出當前資源可以接受的請求方法的列表。node
鑑於 PUT,DELETE 方法會對服務器上的資源進行寫操做,於是絕大部分的網頁服務器都不支持或者在默認配置下不容許上述請求方法,對於此類請求均會返回405錯誤。jquery
406 Not Acceptable:請求的資源的內容特性沒法知足請求頭中的條件,於是沒法生成響應實體。ios
500 Internal Server Error:服務器遇到了一個不曾預料的情況,致使了它沒法完成對請求的處理。通常來講,這個問題都會在服務器端的源代碼出現錯誤時出現。nginx
501 Not Implemented:服務器不支持當前請求所須要的某個功能。當服務器沒法識別請求的方法,而且沒法支持其對任何資源的請求。es6
502 Bad Gateway:做爲網關或者代理工做的服務器嘗試執行請求時,從上游服務器接收到無效的響應。
503 Service Unavailable:因爲臨時的服務器維護或者過載,服務器當前沒法處理請求。這個情況是臨時的,而且將在一段時間之後恢復。若是可以預計延遲時間,那麼響應中能夠包含一個 Retry-After 頭用以標明這個延遲時間。若是沒有給出這個 Retry-After 信息,那麼客戶端應當以處理500響應的方式處理它。
注意:503狀態碼的存在並不意味着服務器在過載的時候必須使用它。某些服務器只不過是但願拒絕客戶端的鏈接。
504 Gateway Timeout:做爲網關或者代理工做的服務器嘗試執行請求時,未能及時從上游服務器(URI標識出的服務器,例如HTTP、FTP、LDAP)或者輔助服務器(例如DNS)收到響應。
注意:某些代理服務器在DNS查詢超時時會返回400或者500錯誤
505 HTTP Version Not Supported:服務器不支持,或者拒絕支持在請求中使用的 HTTP 版本。這暗示着服務器不能或不肯使用與客戶端相同的版本。響應中應當包含一個描述了爲什麼版本不被支持以及服務器支持哪些協議的實體。
· 200 OK (from cache) ——強制緩存,指的是瀏覽器沒有跟服務器確認,直接用了瀏覽器緩存。經過設置 expires/cache-control 來實現的。雖然是強緩存,但用戶主動觸發的刷新行爲,仍是會採用緩存協商的策略
,主動觸發的刷新行爲包括點擊刷新按鈕、右鍵刷新、f5刷新、ctrl+f5刷新等。
· 304 Not Modified——協商緩存,比 200 OK (from cache) 慢,指的是瀏覽器還向服務器確認了下 "If-Not-Modified",才用的緩存。
Last-Modified:在瀏覽器第一次請求某一個URL時,服務器端的返回狀態會是200,資源響應頭有一個Last-Modified的屬性標記此文件在服務期端最後被修改的時間,另一半也有個Etag。
HTTP中,經過Cache-Control首部和Expires首部爲文檔指定了過時時間,經過對過時時間的判斷,緩存就能夠知道文檔是否是在保質期內。
Last-Modified(Etag)
(1)Last-Modified : http1.0時期屬性, 如今仍在使用。
(2)ETag(Entity Tag) http1.1時期新加屬性 。由於如下幾個緣由增長此屬性:
Last-Modified與ETag同時使用時,瀏覽器在驗證時會同時發送If-Modified-Since和If-None-Match,按照http/1.1規範,若是同時使用If-Modified-Since和If-None-Match則服務端必須兩個都驗證經過後才能返回304;且nginx就是這樣作的。所以實際使用時應該根據實際狀況選擇。
分佈式的Web系統中,當訪問落在不一樣的物理機上時會返回不一樣的ETag,進而致使304失效,降級爲200請求,因此常常在使用中會關閉ETag。
Cache-Control(expires)
(1)Pragma : no-cache http1.0時期的屬性 爲了兼容會使用
(2)expires:0 http1.0時期的屬性 ,如今默認瀏覽器均默認使用HTTP 1.1,因此它的做用基本忽略。expires 的一個缺點就是,返回的到期時間是服務器端的時間,這樣存在一個問題,若是客戶端的時間與服務器的時間相差很大(好比時鐘不一樣步,或者跨時區),那麼偏差就很大,因此在HTTP 1.1版開始,使用Cache-Control: max-age=秒替代。
(3)Cache-Control http1.1 中加入的新屬性,它有如下經常使用參數:
301和302狀態碼都表示重定向,就是說瀏覽器在拿到服務器返回的這個狀態碼後會自動跳轉到一個新的URL地址,這個地址能夠從響應的Location首部中獲取(用戶看到的效果就是他輸入的地址A瞬間變成了另外一個地址B)
場景一 想換個域名,舊的域名不用啦,這樣用戶訪問舊域名時用301就重定向到新的域名。其實也是告訴搜索引擎收錄的域名須要對新的域名進行收錄。
場景二 登陸後重定向到指定的頁面,這種場景比較常見就是登陸成功跳轉到具體的系統頁面。
場景三 有時候須要自動刷新頁面,好比5秒後回到訂單詳細頁面之類。
場景四 有時系統進行升級或者切換某些功能時,須要臨時更換地址。
場景五 像微博之類的使用短域名,用戶瀏覽後須要重定向到真實的地址之類。
從網址A 作一個302 重定向到網址B 時,主機服務器的隱含意思是網址A 隨時有可能改主意,從新顯示自己的內容或轉向其餘的地方。大部分的搜索引擎在大部分狀況下,當收到302重定向時,通常只要去抓取目標網址就能夠了,也就是說網址B。若是搜索引擎在遇到302 轉向時,百分之百的都抓取目標網址B 的話,就不用擔憂網址URL 劫持了。問題就在於,有的時候搜索引擎,尤爲是Google,並不能老是抓取目標網址。
好比說,有的時候A 網址很短,可是它作了一個302重定向到B網址,而B網址是一個很長的亂七八糟的URL網址,甚至還有可能包含一些問號之類的參數。很天然的,A網址更加用戶友好,而B網址既難看,又不用戶友好。這時Google頗有可能會仍然顯示網址A。因爲搜索引擎排名算法只是程序而不是人,在遇到302重定向的時候,並不能像人同樣的去準確斷定哪個網址更適當,這就形成了網址URL劫持的可能性。也就是說,一個不道德的人在他本身的網址A作一個302重定向到你的網址B,出於某種緣由, Google搜索結果所顯示的仍然是網址A,可是所用的網頁內容倒是你的網址B上的內容,這種狀況就叫作網址URL 劫持。你辛辛苦苦所寫的內容就這樣被別人偷走了。302重定向所形成的網址URL劫持現象,已經存在一段時間了。不過到目前爲止,彷佛也沒有什麼更好的解決方法。
大致意思是會引發搜索引擎的排名,並且302重定向很容易被搜索引擎誤認爲是利用多個域名指向同一網站,那麼你的網站就會被封掉。總之,除非真是臨時重定向使用302,其餘的狀況最好仍是使用301.
cookie 是一個很是具體的東西,指的就是瀏覽器裏面能永久存儲的一種數據,僅僅是瀏覽器實現的一種數據存儲功能。
cookie由服務器生成,發送給瀏覽器,瀏覽器把cookie以kv形式保存到某個目錄下的文本文件內,下一次請求同一網站時會把該cookie發送給服務器。因爲cookie是存在客戶端上的,因此瀏覽器加入了一些限制確保cookie不會被惡意使用,同時不會佔據太多磁盤空間,因此每一個域的cookie數量是有限的。服務端能夠設置httpOnly,使得前端沒法操做cookie
session 從字面上講,就是會話。這個就相似於你和一我的交談,你怎麼知道當前和你交談的是張三而不是李四呢?對方確定有某種特徵(長相等)代表他就是張三。
session 也是相似的道理,服務器要知道當前發請求給本身的是誰。爲了作這種區分,服務器就要給每一個客戶端分配不一樣的「身份標識」,而後客戶端每次向服務器發請求的時候,都帶上這個「身份標識」,服務器就知道這個請求來自於誰了。至於客戶端怎麼保存這個「身份標識」,能夠有不少種方式,對於瀏覽器客戶端,你們都默認採用 cookie 的方式。
服務器使用session把用戶的信息臨時保存在了服務器上,用戶離開網站後session會被銷燬。這種用戶信息存儲方式相對cookie來講更安全,但是session有一個缺陷:若是web服務器作了負載均衡,那麼下一個操做請求到了另外一臺服務器的時候session會丟失。
在Web領域基於Token的身份驗證隨處可見。在大多數使用Web API的互聯網公司中,tokens 是多用戶下處理認證的最佳方式。
如下幾點特性會讓你在程序中使用基於Token的身份驗證
1.無狀態、可擴展
2.支持移動設備
3.跨程序調用
4.安全
基於服務器驗證方式暴露的一些問題
1.Seesion:每次認證用戶發起請求時,服務器須要去建立一個記錄來存儲信息。當愈來愈多的用戶發請求時,內存的開銷也會不斷增長。
2.可擴展性:在服務端的內存中使用Seesion存儲登陸信息,伴隨而來的是可擴展性問題。
3.CORS(跨域資源共享):當咱們須要讓數據跨多臺移動設備上使用時,跨域資源的共享會是一個讓人頭疼的問題。在使用Ajax抓取另外一個域的資源,就能夠會出現禁止請求的狀況。
4.CSRF(跨站請求僞造):用戶在訪問銀行網站時,他們很容易受到跨站請求僞造的攻擊,而且可以被利用其訪問其餘的網站。
在這些問題中,可擴展行是最突出的。所以咱們有必要去尋求一種更有行之有效的方法。
基於Token的驗證原理
基於Token的身份驗證是無狀態的,咱們不將用戶信息存在服務器或Session中。這種概念解決了在服務端存儲信息時的許多問題,NoSession意味着你的程序能夠根據須要去增減機器,而不用去擔憂用戶是否登陸。
基於Token的身份驗證的過程以下:
1.用戶經過用戶名和密碼發送請求。
2.程序驗證。
3.程序返回一個簽名的token 給客戶端。
4.客戶端儲存token,而且每次用於每次發送請求。
5.服務端驗證token並返回數據。
本部分摘自:http://www.javashuo.com/article/p-pmqrabgg-cs.html
1.使用前端cookie技術來保存本地化數據,如jquery.cookie.js;
2.使用html5提供的localStorage技術來提供解決方案;
html5中的Web Storage包括了兩種存儲方式:sessionStorage和localStorage。
sessionStorage用於本地存儲一個會話(session)中的數據,這些數據只有在同一個會話中的頁面才能訪問而且當會話結束後數據也隨之銷燬。所以sessionStorage不是一種持久化的本地存儲,僅僅是會話級別的存儲。而localStorage用於持久化的本地存儲,除非主動刪除數據,不然數據是永遠不會過時的。若是是要永久保存的,那麼就請使用localStorage方法存取值,若是是要瀏覽關閉會話結束就清除緩存的,固然就得選擇sessionStorage方法了;
網絡通信大部分是基於TCP/IP的,而TCP/IP是基於IP地址的,因此計算機在網絡上進行通信時只能識別如「202.96.134.133」之類的IP地址,而不能認識域名。咱們沒法記住10個以上IP地址的網站,因此咱們訪問網站時,更多的是在瀏覽器地址欄中輸入域名,就能看到所須要的頁面,這是由於有一個叫「DNS服務器」的計算機自動把咱們的域名「翻譯」成了相應的IP地址,而後調出IP地址所對應的網頁。它所提供的服務是用來將主機名和域名轉換爲IP地址.
一、在瀏覽器中輸入www . qq .com 域名,操做系統會先檢查本身本地的hosts文件是否有這個網址映射關係,若是有,就先調用這個IP地址映射,完成域名解析。
二、若是hosts裏沒有這個域名的映射,則查找本地DNS解析器緩存,是否有這個網址映射關係,若是有,直接返回,完成域名解析。
三、若是hosts與本地DNS解析器緩存都沒有相應的網址映射關係,首先會找TCP/ip參數中設置的首選DNS服務器,在此咱們叫它本地DNS服務器,此服務器收到查詢時,若是要查詢的域名,包含在本地配置區域資源中,則返回解析結果給客戶機,完成域名解析,此解析具備權威性。
四、若是要查詢的域名,不禁本地DNS服務器區域解析,但該服務器已緩存了此網址映射關係,則調用這個IP地址映射,完成域名解析,此解析不具備權威性。
五、若是本地DNS服務器本地區域文件與緩存解析都失效,則根據本地DNS服務器的設置(是否設置轉發器)進行查詢,若是未用轉發模式,本地DNS就把請求發至13臺根DNS,根DNS服務器收到請求後會判斷這個域名(.com)是誰來受權管理,並會返回一個負責該頂級域名服務器的一個IP。本地DNS服務器收到IP信息後,將會聯繫負責.com域的這臺服務器。這臺負責.com域的服務器收到請求後,若是本身沒法解析,它就會找一個管理.com域的下一級DNS服務器地址(http://qq.com)給本地DNS服務器。當本地DNS服務器收到這個地址後,就會找http://qq.com域服務器,重複上面的動做,進行查詢,直至找到www . qq .com主機。
六、若是用的是轉發模式,此DNS服務器就會把請求轉發至上一級DNS服務器,由上一級服務器進行解析,上一級服務器若是不能解析,或找根DNS或把轉請求轉至上上級,以此循環。無論是本地DNS服務器用是是轉發,仍是根提示,最後都是把結果返回給本地DNS服務器,由此DNS服務器再返回給客戶機。
從客戶端到本地DNS服務器是屬於遞歸查詢,而DNS服務器之間就是的交互查詢就是迭代查詢。
1) 瀏覽器緩存
當用戶經過瀏覽器訪問某域名時,瀏覽器首先會在本身的緩存中查找是否有該域名對應的IP地址(若曾經訪問過該域名且沒有清空緩存便存在);
2) 系統緩存
當瀏覽器緩存中無域名對應IP則會自動檢查用戶計算機系統Hosts文件DNS緩存是否有該域名對應IP;
3) 路由器緩存
當瀏覽器及系統緩存中均無域名對應IP則進入路由器緩存中檢查,以上三步均爲客服端的DNS緩存;
4) ISP(互聯網服務提供商)DNS緩存
當在用戶客服端查找不到域名對應IP地址,則將進入ISP DNS緩存中進行查詢。好比你用的是電信的網絡,則會進入電信的DNS緩存服務器中進行查找;
5) 根域名服務器
當以上均未完成,則進入根服務器進行查詢。全球僅有13臺根域名服務器,1個主根域名服務器,其他12爲輔根域名服務器。根域名收到請求後會查看區域文件記錄,若無則將其管轄範圍內頂級域名(如.com)服務器IP告訴本地DNS服務器;
6) 頂級域名服務器
頂級域名服務器收到請求後查看區域文件記錄,若無則將其管轄範圍內主域名服務器的IP地址告訴本地DNS服務器;
7) 主域名服務器
主域名服務器接受到請求後查詢本身的緩存,若是沒有則進入下一級域名服務器進行查找,並重復該步驟直至找到正確紀錄;
8)保存結果至緩存
本地域名服務器把返回的結果保存到緩存,以備下一次使用,同時將該結果反饋給客戶端,客戶端經過這個IP地址與web服務器創建連接。
CDN的全稱是Content Delivery Network,即內容分發網絡。CDN是構建在現有網絡基礎之上的智能虛擬網絡,依靠部署在各地的邊緣服務器,經過中心平臺的負載均衡、內容分發、調度等功能模塊,使用戶就近獲取所需內容,下降網絡擁塞,提升用戶訪問響應速度和命中率。CDN的關鍵技術主要有內容存儲和分發技術。
協議數據單元PDU(Protocol Data Unit)是指對等層次之間傳遞的數據單位
物理層的 PDU是數據位(bit)
數據鏈路層的 PDU是數據幀(frame)
網絡層的PDU是數據報(packet)
傳輸層的 PDU是數據段(segment)
其餘更高層次的PDU是報文(message)
應用層: (典型設備:應用程序,如FTP,SMTP ,HTTP)
DHCP(Dynamic Host Configuration Protocol)動態主機分配協議,使用 UDP 協議工做,主要有兩個用途:給內部網絡或網絡服務供應商自動分配 IP 地址,給用戶或者內部網絡管理員做爲對全部計算機做中央管理的手段。實現即插即用連網。
DNS (Domain Name System )域名解析<端口號53>
FTP (File Transfer Protocol )文件傳輸協議<端口號21>減小或消除不一樣操做系統下處理文件的不兼容性。
HTTP (Hypertext Transfer Protocol )超文本傳輸協議 <端口號 80>, 面向事務的應用層協議。
POP3 (Post Office Protocol 3) 即郵局協議的第3 個版本,用於接受郵件。
SMTP (Simple Mail Transfer Protocol )簡單郵件傳輸協議 <端口號25> 用於發送郵件。
SSH (Secure Shell )安全外殼協議
TELNET 遠程登陸協議 <端口號23>
傳輸層: (典型設備: 進程和端口) 數據單元:數據段 (Segment)
TCP (Transmission Control Protocol )傳輸控制協議提供可靠的面向鏈接的服務,傳輸數據前須先創建鏈接,結束後釋放。可靠的全雙工信道。可靠、有序、無丟失、不重複。
UDP (User Datagram Protocol )用戶數據報協議發送數據前無需創建鏈接,不使用擁塞控制,不保證可靠交付,最大努力交付。
網絡層: (典型設備:路由器,防火牆、多層交換機) 數據單元:數據包(Packet )
IP (IPv4 · IPv6) (Internet Protocol) 網絡之間互連的協議
ARP (Address Resolution Protocol) 即地址解析協議,實現經過IP 地址得 知其物理地址。
RARP (Reverse Address Resolution Protocol)反向地址轉換協議容許局域 網的物理機器從網關服務器的 ARP 表或者緩存上請求其 IP地址。
ICMP (Internet Control Message Protocol )Internet 控制報文協議。它是TCP/IP 協議族的一個子協議,用於在IP 主機、路由器之間傳遞控制消息。
ICMPv6 :
IGMP (Internet Group Management Protocol) Internet 組管理協議,是因特 網協議家族中的一個組播協議,用於 IP 主機向任一個直接相鄰的路由器報 告他們的組成員狀況。
RIP (Router information protocol) 路由信息協議是一種在網關與主機之間交換路由選擇信息的標準。
OSPF (Open Shortest Path Firs)開放式最短路徑優先,分佈式鏈路狀態協議。
BGP(Border Gateway Protocol )邊界網關協議,用來鏈接Internet 上獨立系統的路由選擇協議.採用路徑向量路由選擇協議。
數據鏈路層: (典型設備: 網卡,網橋,交換機) 數據單元:幀 (Frame)
ARQ(Automatic Repeat-reQuest )自動重傳請求協議,錯誤糾正協議之一,包括中止等待ARQ 協議和連續ARQ 協議,錯誤偵測、正面確認、逾時重傳與負面確認繼以重傳等機制。
中止等待協議:
CSMA/CD(Carrrier Sense Multiple Access with Collision Detection)載波監聽多點接入/碰撞檢測協議。總線型網絡,協議的實質是載波監聽和碰撞檢測。載波監聽即發數據前先檢測總線上是否有其餘計算機在發送數據,如暫時不發數據,避免碰撞。碰撞檢測爲計算機邊發送數據邊檢測信道上的信號電壓大小。
PPP(Point-to-Ponit Protocol)點對點協議面向字節,由三部分組成:
一個將IP 數據報封裝到串行鏈路的方法
一個用於創建、配置和測試數據鏈路鏈接的鏈路控制協議LCP
一套網絡控制協議NCP
HDLC (High-Level Data Link Control )高級數據鏈路控制同步網上傳輸數據、面向比特的數據鏈路層協議。
ATM (Asynchronous Transfer Mode )異步傳遞方式,創建在電路交換和分組交換的基礎上的一種面向鏈接的快速分組交換技術。 「異步」是指將ATM 信元「異步插入」到同步的 SDH 比特流中。如同步插入則用戶在每幀中所佔的時隙相對位置固定不變。「同步」是指網絡中各鏈路上的比特流都是受同一很是精確的主時鐘的控制。Wi-Fi 、WiMAX 、DTM 、令牌環、以太網、FDDI 、幀中繼、 GPRS 、 EVDO 、HSPA 、L2TP 、ISDN
物理層:(典型設備:中繼器,集線器) 數據單元:比特 (Bit)
光纖、 同軸電纜、雙絞線…
Transmission Control Protocol/Internet Protocol的簡寫,中譯名爲傳輸控制協議/因特網互聯協議,又名網絡通信協議,是Internet最基本的協議、Internet國際互聯網絡的基礎,由網絡層的IP協議和傳輸層的TCP協議等組成(固然還有其餘後來發展起來的網絡協議,還包括 ARP,ICMP,IGMP,UDP,以及讓域名訪問成爲可能的DNS,以及電腦/手機能夠自動獲取IP地址的DHCP。固然還有形形色色的應用層的協議如 HTTP / SMTP / FTP 等。)。TCP/IP 定義了電子設備如何連入因特網,以及數據如何在它們之間傳輸的標準。協議採用了4層的層級結構,每一層都呼叫它的下一層所提供的協議來完成本身的需求。通俗而言:TCP負責發現傳輸的問題,一有問題就發出信號,要求從新傳輸,直到全部數據安全正確地傳輸到目的地。而IP是給因特網的每一臺聯網設備規定一個地址。
IP協議(Internet Protocol)是將多個包交換網絡鏈接起來,它在源地址和目的地址之間傳送一種稱之爲數據包的東西,它還提供對數據大小的從新組裝功能,以適應不一樣網絡對包大小的要求。IP協議在OSI參考模型中應用於網絡層,以「數據包(Package)」爲單位。其中,IP地址的定義是確認惟一端口號和路由選擇的關鍵,IP地址至關於每臺電話的電話號碼,惟一且是咱們互相聯繫的關鍵,所以IP協議也是網絡互連的關鍵。
IP協議特色
TCP(Transmission Control Protocol 傳輸控制協議)是一種面向鏈接的、可靠的, 基於IP的傳輸層協議。TCP在IP報文的協議號是6。TCP是一個超級麻煩的協議,而它又是互聯網的基礎。
TCP工做在網絡OSI的七層模型中的第四層——Transport層(傳輸層),IP在第三層——Network層,ARP 在第二層——Data Link層。在第二層的數據,咱們把它叫Frame(數據幀),在第三層的數據叫Packet(數據包),第四層的數據叫Segment(數據段)。 同時,咱們須要簡單的知道,數據從應用層發下來,會在每一層都會加上頭部信息,進行封裝,而後再發送到數據接收端。因此數據的發送和接收其實就是數據的封裝和解封裝的過程。
UDP 是User Datagram Protocol的簡稱, 中文名是用戶數據報協議,是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無鏈接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務,IETF RFC 768是UDP的正式規範。UDP在IP報文的協議號是17。與所熟知的TCP(傳輸控制協議)協議同樣,UDP協議直接位於IP(網際協議)協議的頂層。根據OSI(開放系統互連)參考模型,UDP和TCP都屬於傳輸層協議。UDP協議的主要做用是將網絡數據流量壓縮成數據包的形式。一個典型的數據包就是一個二進制數據的傳輸單位。每個數據包的前8個字節(16*4位)用來包含報頭信息,剩餘字節則用來包含具體的傳輸數據。
TCP擁塞控制原理
擁塞控制:
當網絡中某一資源的需求超出了該資源所能提供的可用部分,這時網絡的性能就要開始變壞,這種狀況就叫作擁塞。而擁塞控制就是爲了減小或者避免擁塞對網絡性能的影響而作出的一種控制手段。
擁塞控制思路:發送方維持一個叫作擁塞窗口的狀態變量,擁塞窗口的大小取決於網絡的擁塞程度,而且在動態的變化。發送方讓本身的發送窗口等於擁塞窗口,若是在考慮接收方的接收能力,通常發送窗口還要小於擁塞窗口。
慢開始:當主機開始發送數據的時候,由小到大的增大發送窗口,也就是由小到大的增大擁塞窗口。接收方接收到一個報文以後就回傳一個確認報文,發送方每接收到一個確認報文,就將擁塞窗口加1,這樣每通過一個傳輸輪次以後,擁塞窗口就增大一倍。
擁塞避免:思路是讓擁塞窗口緩慢的增大,即每通過一個往返時間RTT就把發送方的擁塞窗口加1,而不是加倍,這樣擁塞窗口就是線性緩慢增長,比慢開始的增加速率緩慢的多。
慢開始門限:爲了防止擁塞窗口增加過大引發網絡擁塞,還須要設置一個慢開始門限
TCP/UDP區別
1. 通常區別
2. TCP的粘包和UDP的丟包
TCP粘包現象:TCP粘包是指發送方發送的若干包數據到接收方接收時粘成一包,從接收緩衝區看,後一包數據的頭緊接着前一包數據的尾。
粘包緣由:
粘包處理:若是黏在一塊兒的包是同一個總體,即贊成部分數據分割而來的,那麼就不用進行處理。若是是不一樣部分的數據粘到一塊兒,就須要進行粘包解決:
UDP丟包現象:丟包現象即便用UDP發送時,因爲不可靠鏈接方式,收到各類因素影響,數據包可能會在接受過程當中丟失一部分,從而致使數據不完整。
UDP丟包緣由:
UDP丟包處理:
HTTP是一個客戶端和服務器端請求和應答的標準,一般,由HTTP客戶端發起一個請求,創建一個到服務器指定端口(默認是80端口)的TCP鏈接。HTTP服務器則在那個端口監聽客戶端發送過來的請求。一旦收到請求,服務器(向客戶端)發回一個狀態行。 HTTP協議的網頁 HTTP協議的網頁 HTTP使用TCP而不是UDP的緣由在於(打開)一個網頁必須傳送不少數據,而TCP協議提供傳輸控制,按順序組織數據,和錯誤糾正。
經過HTTP或者HTTPS協議(HTTP協議+SSL協議)請求的資源由統一資源標示符(Uniform Resource Identifiers)(或者,更準確一些,URLs)來標識。HTTP有如下特色:
簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法經常使用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯繫的類型不一樣。因爲HTTP協議簡單,使得HTTP服務器的程序規模小,於是通訊速度很快。
URL是一種特殊類型的URI,包含了用於查找某個資源的足夠的信息,URL,全稱是UniformResourceLocator, 中文叫統一資源定位符,是互聯網上用來標識某一處資源的地址。如下面這個URL爲例,介紹下普通URL的各部分組成:
http://www.cnblogs.com:8080/fzz9/index.jsp?id=30303&page=2#name
端口號部分:此網址爲8080。跟在域名後面的是端口號,域名和端口之間使用「:」做爲分隔符。端口不是一個URL必須的部分,若是省略端口部分,將採用默認端口。
本部分摘自:http://www.javashuo.com/article/p-ewsekudn-dm.html http://www.javashuo.com/article/p-fvcfqfjo-cv.html
超文本傳輸協議
http請求頭部字段:http://www.javashuo.com/article/p-qrnsonao-cy.html
HTTPS 是以安全爲目標的 HTTP 通道,簡單講是 HTTP 的安全版,即 HTTP 下加入 SSL 層,HTTPS 的安全基礎是 SSL,所以加密的詳細內容就須要 SSL。
SSL加密過程:
本部分摘自:http://www.javashuo.com/article/p-axrsxogg-dh.html http://www.javashuo.com/article/p-vurbdisw-cr.html(寫的很好呦~)
對於GET方式的請求,瀏覽器會把http header和data一併發送出去,服務器響應200(返回數據);
而對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)
GET和POST是什麼?HTTP協議中的兩種發送請求的方法。
HTTP是什麼?HTTP是基於TCP/IP的關於數據如何在萬維網中如何通訊的協議。
HTTP的底層是TCP/IP。因此GET和POST的底層也是TCP/IP,也就是說,GET/POST都是TCP連接。GET和POST能作的事情是同樣同樣的。你要給GET加上request body,給POST帶上url參數,技術上是徹底行的通的,只要後端支持就好。
實際上,沒有本質區別,可是因爲HTTP的規定和瀏覽器/服務器的限制,致使他們在應用過程當中體現出一些不一樣。(大多數)瀏覽器一般都會限制url長度在2K個字節,而(大多數)服務器最多處理64K大小的url。超過的部分,恕不處理。若是你用GET服務,在request body偷偷藏了數據,不一樣服務器的處理方式也是不一樣的,有些服務器會幫你卸貨,讀出數據,有些服務器直接忽略,因此,雖然GET能夠帶request body,也不能保證必定能被接收到哦。
本部分摘自:https://blog.51cto.com/13961945/2287553
Axios 是一個基於 promise 的 HTTP 庫,能夠用在瀏覽器和 node.js 中。
它的特性是:
axios包含全部請求方式函數的封裝、
axios.get(url [,config]) axios.delete(url [,config]) axios.head(url [,config]) axios.post(url [,data [,config]]) axios.put(url [,data [,config]]) axios.patch(url [,data [,config]])
本部分摘自:https://www.jianshu.com/p/ae8e9edf4460
SYN(synchronous創建聯機)
ACK(acknowledgement 確認)
PSH(push傳送)
FIN(finish結束)
RST(reset重置)
URG(urgent緊急)
第一次握手:Client將標誌位SYN置爲1,隨機產生一個值seq=J,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。
第二次握手:Server收到數據包後由標誌位SYN=1知道Client請求創建鏈接,Server將標誌位SYN和ACK都置爲1,ack (number )=J+1,隨機產生一個值seq=K,並將該數據包發送給Client以確認鏈接請求,Server進入SYN_RCVD狀態。
第三次握手:Client收到確認後,檢查ack是否爲J+1,ACK是否爲1,若是正確則將標誌位ACK置爲1,ack=K+1,並將該數據包發送給Server,Server檢查ack是否爲K+1,ACK是否爲1,若是正確則鏈接創建成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間能夠開始傳輸數據了。
爲何三次握手?
有這樣一種狀況,當A發送一個消息給B,可是因爲網絡緣由,消息被阻塞在了某個節點,而後阻塞的時間超出設定的時間,A會認爲這個消息丟失了,而後從新發送消息。
當A和B通訊完成後,這個被A認爲失效的消息,到達了B
對於B而言,覺得這是一個新的請求連接消息,就向A發送確認,
對於A而言,它認爲沒有給B再次發送消息(由於上次的通話已經結束)全部A不會理睬B的這個確認,可是B則會一直等待A的消息
這就致使了B的時間被浪費(對於服務器而言,CPU等資源是一種浪費),這樣是不可行的,這就是爲何不能兩次握手的緣由了。
先由客戶端向服務器端發送一個FIN,請求關閉數據傳輸。
當服務器接收到客戶端的FIN時,向客戶端發送一個ACK,其中ack的值等於FIN+SEQ
而後服務器向客戶端發送一個FIN,告訴客戶端應用程序關閉。
當客戶端收到服務器端的FIN是,回覆一個ACK給服務器端。其中ack的值等於FIN+SEQ
爲何要4次揮手?
爲何須要TIME_WAIT狀態
SYN攻擊:
在三次握手過程當中,Server發送SYN-ACK以後,收到Client的ACK以前的TCP鏈接稱爲半鏈接(half-open connect),此時Server處於SYN_RCVD狀態,當收到ACK後,Server轉入ESTABLISHED狀態。SYN攻擊就是Client在短期內僞造大量不存在的IP地址,並向Server不斷地發送SYN包,Server回覆確認包,並等待Client的確認,因爲源地址是不存在的,所以,Server須要不斷重發直至超時,這些僞造的SYN包將長時間佔用未鏈接隊列,致使正常的SYN請求由於隊列滿而被丟棄,從而引發網絡堵塞甚至系統癱瘓。SYN攻擊時一種典型的DDOS攻擊,檢測SYN攻擊的方式很是簡單,即當Server上有大量半鏈接狀態且源IP地址是隨機的,則能夠判定遭到SYN攻擊了。
本部分摘自:http://www.javashuo.com/article/p-gdgxchwo-cd.html
瀏覽器的同源策略致使了跨域:同源策略限制了從同一個源加載的文檔或腳本如何與來自另外一個源的資源進行交互。這是一個用於隔離潛在惡意文件的重要安全機制。
- 不一樣的域名 (好比在網站 example.com 請求 api.com)
- 不一樣的子域名 (好比在網站 example.com 請求 api.example.com)
- 不一樣的端口 (好比在網站 example.com 請求 example.com:3001)
- 不一樣協議 (好比在網站 https://example.com 請求 http://example.com)
瀏覽器只對XHR(XMLHttpRequest)請求有同源請求限制,而對script標籤src屬性、link標籤ref屬性和img標籤src屬性沒有這這種限制,利用這個「漏洞」就能夠很好的解決跨域請求。JSONP就是利用了script標籤無同源限制的特色來實現的,當向第三方站點請求時,咱們能夠將此請求放在<script>標籤的src屬性裏,這就如同咱們請求一個普通的JS腳本,能夠自由的向不一樣的站點請求:
<script src="http://www.b.com/request?para1=1"></script>
只支持GET,不支持POST請求
/** * JSONP請求工具 * @param url 請求的地址 * @param data 請求的參數 * @returns {Promise<any>} */ const request = ({url, data}) => { return new Promise((resolve, reject) => { // 處理傳參成xx=yy&aa=bb的形式 const handleData = (data) => { const keys = Object.keys(data) const keysLen = keys.length return keys.reduce((pre, cur, index) => { const value = data[cur] const flag = index !== keysLen - 1 ? '&' : '' return `${pre}${cur}=${value}${flag}` }, '') } // 動態建立script標籤 const script = document.createElement('script') // 接口返回的數據獲取 window.jsonpCb = (res) => { document.body.removeChild(script) delete window.jsonpCb resolve(res) } script.src = `${url}?${handleData(data)}&cb=jsonpCb` document.body.appendChild(script) }) } // 使用方式 request({ url: 'http://localhost:9871/api/jsonp', data: { // 傳參 msg: 'helloJsonp' } }).then(res => { console.log(res) })
//它的基本思想是,網頁經過添加一個<script>元素,向服務器請求JSON數據,這種作法不受同源政策限制;服務器收到請求後,將數據放在一個指定名字的回調函數裏傳回來。 //首先,網頁動態插入<script>元素,由它向跨源網址發出請求。 function addScriptTag(src) { var script = document.createElement('script'); script.setAttribute("type","text/javascript"); script.src = src; document.body.appendChild(script); } window.onload = function () { addScriptTag('http://example.com/ip?callback=foo'); } function foo(data) { console.log('Your public IP address is: ' + data.ip); }; //上面代碼經過動態添加<script>元素,向服務器example.com發出請求。注意,該請求的查詢字符串有一個callback參數,用來指定回調函數的名字,這對於JSONP是必需的。 //服務器收到這個請求之後,會將數據放在回調函數的參數位置返回。
CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)
瀏覽器將CORS請求分紅兩類:簡單請求(simple request)和非簡單請求(not-so-simple request)。
只要同時知足如下兩大條件,就屬於簡單請求。
(1) 請求方法是如下三種方法之一:
(2)HTTP的頭信息不超出如下幾種字段:
這個頭部信息由服務器返回,用來明確指定那些客戶端的域名容許訪問這個資源
簡單請求
瀏覽器會在在header信息裏面多加一個字段:
key:origin
value:協議+域名+端口(如https://localhost:8080)
服務器根據對象裏的origin值來決定是否贊成此次請求
若是請求經過
請求經過後,服務器會在header裏多增長几個字段:
非簡單請求
非簡單請求的方法就是Put,Delete,或者Content-Type是application/json
非簡單請求在發出CORS請求以前,會增長一次HTTP查詢請求,也叫預檢請求
預檢請求成功了,瀏覽器才能發出XMLHttpRequest,不然報錯
若是瀏覽器發現這是一個非簡單請求
就會先發送一個預檢請求:
OPTIONS /cors HTTP/1.1 Origin: http://localhost:8088 Access-Control-Request-Method: PUT Access-Control-Request-Headers: token
預測請求的方法名叫OPTIONS
Origin和簡單請求同樣
Access-Control-Request-Method是請求方法
Access-Control-Request-Headers是額外發送的頭信息字段
(tip:預檢請求通常緩存下來,以便不須要在每次請求都發送)
若是預檢請求經過
咱們來看下服務器發出的迴應
HTTP/1.1 200 OK Date: Nov, 01 Dec 2017 01:15:39 GMT Server: Apache/2.0.61 (Unix) Access-Control-Allow-Origin: http://localhost:8088 Access-Control-Allow-Methods: GET, POST, PUT Access-Control-Allow-Headers: token Content-Type: text/html; charset=utf-8 Content-Encoding: gzip Content-Length: 0 Keep-Alive: timeout=2, max=100 Connection: Keep-Alive Content-Type: text/plain
若是預檢請求失敗
服務器會返回一個HTTP迴應(沒有CORS的頭信息字段)
並在console打出not allowed by Access-Control-Allow-Origin
異常
預檢請求經過之後
瀏覽器發每次出的CORS請求就和簡單請求同樣
會有一個origin字段
服務器每次迴應都會有Access-Control-Allow-Origin
頭信息字段
此方案僅限主域相同,子域不一樣的跨域應用場景。
實現原理:兩個頁面都經過js強制設置document.domain爲基礎主域,就實現了同域。
父窗口(http://www.demo.com/a.html) <iframe id="iframe" src="http://child.demo.com/b.html"></iframe> <script> document.domain = 'demo.com'; var user = 'admin'; </script> 子窗口:(http://child.demo.com/b.html) <script> document.domain = 'demo.com'; // 獲取父窗口中變量 alert('get js data from parent ---> ' + window.parent.user); </script>
實現原理: a欲與b跨域相互通訊,經過中間頁c來實現。 三個頁面,不一樣域之間利用iframe的location.hash傳值,相同域之間直接js訪問來通訊。
具體實現:A域:a.html -> B域:b.html -> A域:c.html,a與b不一樣域只能經過hash值單向通訊,b與c也不一樣域也只能單向通訊,但c與a同域,因此c可經過parent.parent訪問a頁面全部對象。
實現原理: a欲與b跨域相互通訊,經過中間頁c來實現。 三個頁面,不一樣域之間利用iframe的location.hash傳值,相同域之間直接js訪問來通訊。
具體實現:A域:a.html -> B域:b.html -> A域:c.html,a與b不一樣域只能經過hash值單向通訊,b與c也不一樣域也只能單向通訊,但c與a同域,因此c可經過parent.parent訪問a頁面全部對象。
window.name屬性的獨特之處:name值在不一樣的頁面(甚至不一樣域名)加載後依舊存在,而且能夠支持很是長的 name 值(2MB)。
postMessage是HTML5 XMLHttpRequest Level 2中的API,且是爲數很少能夠跨域操做的window屬性之一,它可用於解決如下方面的問題:
a.) 頁面和其打開的新窗口的數據傳遞
b.) 多窗口之間消息傳遞
c.) 頁面與嵌套的iframe消息傳遞
d.) 上面三個場景的跨域數據傳遞
用法:postMessage(data,origin)方法接受兩個參數
data: html5規範支持任意基本類型或可複製的對象,但部分瀏覽器只支持字符串,因此傳參時最好用JSON.stringify()序列化。
origin: 協議+主機+端口號,也能夠設置爲"*",表示能夠傳遞給任意窗口,若是要指定和當前窗口同源的話設置爲"/"。
<iframe id="iframe" src="http://www.demo2.com/b.html" style="display:none;"></iframe> <script> var iframe = document.getElementById('iframe'); iframe.onload = function() { var data = { name: 'aym' }; // 向domain2傳送跨域數據 iframe.contentWindow.postMessage(JSON.stringify(data), 'http://www.demo2.com'); }; // 接受domain2返回數據 window.addEventListener('message', function(e) { alert('data from demo2 ---> ' + e.data); }, false); </script> <script> // 接收domain1的數據 window.addEventListener('message', function(e) { alert('data from demo1 ---> ' + e.data); var data = JSON.parse(e.data); if (data) { data.number = 16; // 處理後再發回domain1 window.parent.postMessage(JSON.stringify(data), 'http://www.demo1.com'); } }, false); </script>
本部分摘自:https://segmentfault.com/a/1190000015597029?utm_source=tag-newest
https://segmentfault.com/a/1190000017867312?utm_source=tag-newest
http://www.javashuo.com/article/p-vwlsbjnn-br.html
其原理是攻擊者向有 XSS漏洞的網站中輸入(傳入)惡意的HTML代碼,當其它用戶瀏覽該網站時,這段HTML代碼會自動執行,從而達到攻擊的目的。如,盜取用戶 Cookie、破壞頁面的正常結構,插入廣告等惡意內容、重定向到其它網站,D-doss攻擊等;XSS攻擊相似於SQL注入攻擊,攻擊以前,咱們先找到一個存在XSS漏洞的網站。理論上,全部可輸入的地方沒有對輸入數據進行處理的話,都會存在XSS漏洞,漏洞的危害取決於攻擊代碼的威力。
反射型
發出請求時,XSS代碼出如今url中,做爲輸入提交到服務器端,服務器端解析後響應,XSS代碼隨響應內容一塊兒傳回給瀏覽器,最後瀏覽器解析執行XSS代碼。這個過程像一次反射,因此叫反射型XSS。
存儲型
存儲型XSS和反射型XSS的差異在於,提交的代碼會存儲在服務器端(數據庫、內存、文件系統等),下次請求時目標頁面時不用再提交XSS代碼。
防範措施
設置httponly,對cookie進行保護
編碼:對用戶輸入的數據進行 HTML Entity 編碼。Encode的做用是將等一些字符進行轉化,使得瀏覽器在最終輸出結果上是同樣的。
過濾:移除用戶輸入的和事件相關的屬性。如onerror能夠自動觸發攻擊,還有onclick等。移除用戶輸入的Style節點、Script節點、Iframe節點。(尤爲是Script節點,它但是支持跨域的呀,必定要移除)。
校訂:避免直接對HTML Entity進行解碼。使用DOM Parse轉換,校訂不配對的DOM標籤。
該攻擊能夠在受害者絕不知情的狀況下以受害者名義僞造請求發送給受攻擊站點,從而在未受權的狀況下執行在權限保護之下的操做,具備很大的危害性。具體來說,能夠這樣理解CSRF攻擊:攻擊者盜用了你的身份,以你的名義發送惡意請求,對服務器來講這個請求是徹底合法的,可是卻完成了攻擊者所指望的一個操做,好比以你的名義發送郵件、發消息,盜取你的帳號,添加系統管理員,甚至於購買商品、虛擬貨幣轉帳等。
防範措施
方法1、Token 驗證:(用的最多)
服務器發送給客戶端一個token;
客戶端提交的表單中帶着這個token。
若是這個 token 不合法,那麼服務器拒絕這個請求。
方法二:隱藏令牌:
把 token 隱藏在 http 的 head頭中。
方法二和方法一有點像,本質上沒有太大區別,只是使用方式上有區別。
方法3、Referer 驗證:
Referer 指的是頁面請求來源。意思是,只接受本站的請求,服務器才作響應;若是不是,就攔截。
CSRF 和 XSS 的區別
區別一:
CSRF:須要用戶先登陸網站A,獲取 cookie。
XSS:不須要登陸。
區別二:(原理的區別)
CSRF:是利用網站A自己的漏洞,去請求網站A的api。
XSS:是向網站 A 注入 JS代碼,而後執行 JS 裏的代碼,篡改網站A的內容
本部分摘自:https://blog.csdn.net/m0_37686205/article/details/90030588
websocket是HTML5的一個新協議,它容許服務端向客戶端傳遞信息,實現瀏覽器和客戶端雙工通訊。
服務器能夠主動向客戶端推送信息,客戶端也能夠主動向服務器發送信息,是真正的雙向平等對話,屬於服務器推送技術的一種。
本部分摘自:http://www.javashuo.com/article/p-qqicfccz-ec.html
傳統的Http應用裏都是一次TCP鏈接一次request。
這種狀況下效率有點低:
短鏈接
所謂短鏈接,就是每次請求一個資源就創建鏈接,請求完成後鏈接立馬關閉。每次請求都通過「建立tcp鏈接->請求資源->響應資源->釋放鏈接」這樣的過程
長鏈接
所謂長鏈接(persistent connection),就是隻創建一次鏈接,屢次資源請求都複用該鏈接,完成後關閉。要請求一個頁面上的十張圖,只須要創建一次tcp鏈接,而後依次請求十張圖,等待資源響應,釋放鏈接。
並行鏈接
所謂並行鏈接(multiple connections),其實就是併發的短鏈接。
(1) client發出的HTTP請求頭須要增長Connection:keep-alive字段
(2) Web-Server端要能識別Connection:keep-alive字段,而且在http的response裏指定Connection:keep-alive字段,告訴client,我能提供keep-alive服務,而且"應允"client我暫時不會關閉socket鏈接
在HTTP/1.0裏,爲了實現client到web-server能支持長鏈接,必須在HTTP請求頭裏顯示指定
Connection:keep-alive
在HTTP/1.1裏,就默認是開啓了keep-alive,要關閉keep-alive須要在HTTP請求頭裏顯示指定
Connection:close
如今大多數瀏覽器都默認是使用HTTP/1.1,因此keep-alive都是默認打開的。一旦client和server達成協議,那麼長鏈接就創建好了。
客戶端和服務端在創建鏈接並完成request後並不會當即斷開TCP鏈接,而是在下次request來臨時複用此次TCP鏈接。可是這裏也必需要有TCP鏈接的timeout時間限制。否則會形成服務端端口被長期佔用釋放不了。
對於不適用keepalive的request來講,無論是客戶端仍是服務端都是經過TCP的連接的斷開知道request的結束(TCP 揮手時會check 數據包的 seq, 保證數據完整性)。
支持keepalive後,如何知道request結束了呢?
在Http1.1的版本里, 解決方案是request 和reponse裏使用contentLength來幫助確認是否收到所有數據。
另外一個問題就是在使用keepalive的狀況,客戶端依然有同時發送多個請求的狀況,好比網頁加載是須要同時load多個靜態資源。好比 瀏覽器默認最大鏈接數是6,如今有十個資源同時加載,那麼這十個裏會有6個並行,4個與前6個串行。
在keepalive裏有個問題就是若是能知道每一個repose與其對應的request的話,併發的請求能夠只須要一次TCP鏈接,這也就是http2.0實現的多路複用
本部分摘自(圖是別人的,畫的巨好,可是沒找到原做者):http://www.javashuo.com/article/p-rhbsanol-bo.html
長輪詢
AMD、CMD、CommonJs是ES5中提供的模塊化編程的方案,import/export是ES6中新增的。
1. AMD-異步模塊定義
AMD是RequireJS在推廣過程當中對模塊定義的規範化產出,它是一個概念,RequireJS是對這個概念的實現,就比如JavaScript語言是對ECMAScript規範的實現。AMD是一個組織,RequireJS是在這個組織下自定義的一套腳本語言。RequireJS:是一個AMD框架,能夠異步加載JS文件,按照模塊加載方法,經過define()函數定義,第一個參數是一個數組,裏面定義一些須要依賴的包,第二個參數是一個回調函數,經過變量來引用模塊裏面的方法,最後經過return來輸出。
2. CMD---是SeaJS在推廣過程當中對模塊定義的規範化產出,是一個同步模塊定義,是SeaJS的一個標準,SeaJS是CMD概念的一個實現,SeaJS是淘寶團隊提供的一個模塊開發的js框架.
3. CommonJS規範---是經過module.exports定義的,在前端瀏覽器裏面並不支持module.exports,經過node.js後端使用的。Nodejs端是使用CommonJS規範的,前端瀏覽器通常使用AMD、CMD、ES6等定義模塊化開發的。
3. ES6特性,模塊化---export/import對模塊進行導出導入的。
AMD推崇依賴前置,在定義模塊的時候就要聲明其依賴的模塊
CMD推崇就近依賴,只有在用到某個模塊的時候再去require
不少人說requireJS是異步加載模塊,SeaJS是同步加載模塊,這麼理解其實是不許確的,其實加載模塊都是異步的,只不過AMD依賴前置,js能夠方便知道依賴模塊是誰,當即加載,而CMD就近依賴,須要使用把模塊變爲字符串解析一遍才知道依賴了那些模塊,這也是不少人詬病CMD的一點,犧牲性能來帶來開發的便利性,實際上解析模塊用的時間短到能夠忽略