引言:作為APP測試人員,了解Android APP 開發的一些基礎認識是很好的。
http://www.runoob.com/w3cnote/android-tutorial-system-architecture-analysis.html
1.解決兼容問題
那么多的系統版本,我們開發的時候要針對哪個版本進行開發? 這就是作為一個Android必須面對的Android的"碎片化"問題了,而這個問題又分為兩個: ①系統碎片化:我們開發App時可能需要做到低版本兼容,比如,最低兼容至2.3版本;由於各種Rom定制的盛行,國人都喜歡對原生系統做一些更改,這導致了在原生系統上可行,而在定制Rom上不可行的問題,比如相機調用~ ②屏幕碎片化:市面上各種各樣屏幕尺寸的手機,4.3寸,4.5寸,4.7寸,5.0寸,5.3寸...等等,除了手機外,還有Android平板,所以開發時我們可能要處理這個屏幕適配的問題
2.APP開發涉及架構

架構的簡單理解:
- Application(應用程序層) 我們一般說的應用層的開發就是在這個層次上進行的,當然包括了系統內置的一組應用程序,使用的是Java語言
- Application Framework(應用程序框架層) 無論系統內置或者我們自己編寫的App,都需要使用到這層,比如我們想弄來電黑名單,自動掛斷電話,我們就需要用到電話管理(TelephonyManager) 通過該層我們就可以很輕松的實現掛斷操作,而不需要關心底層實現
- Libraries(庫) + Android Runtime(Android運行時) Android給我們提供了一組C/C++庫,為平台的不同組件所使用,比如媒體框架;而Android Runtime則由Android核心庫集 + Dalvik虛擬機構成,Dalvik虛擬機是針對移動設備的虛擬機,它的特點:不需要很快的CPU計算速度和大量的內存空間;而每個App都單獨地運行在單獨的Dalvik虛擬機內每個app對於一條Dalvik進程)而他的簡單運行流程如:
- Linux內核 這里就是涉及底層驅動的東西了,一些系統服務,比如安全性,內存管理以及進程管理等
3.開發工具
Android Studio是比較吃配置的,如果電腦不怎么好,建議還是先使用Eclipse進行Android開發
adb常用命令:

打包流程:

和Java不同,我們的App運行在虛擬機上,而我們的控制台卻並不會顯示相關信息,只有安裝狀態而已,所以我們會在Logcat上查看APP程序運行的日志信息
----------------------------------------------------------------------------------------
什么是簽名,有什么用:
Android APP都需要我們用一個證書對應用進行數字簽名,不然的話是無法安裝到Android手機上的,平時我們調試運行時到手機上時,是AS會自動用默認的密鑰和證書來進行簽名;但是我們實際發布編譯時,則不會自動簽名,這個時候我們就需要進行手動簽名了! 為我們的APK簽名有以下好處:
- 1.應用程序升級:如果你希望用戶無縫升級到新的版本,那么你必須用同一個證書進行簽名。這是由於只有以同一個證書簽名,系統才會允許安裝升級的應用程序。如果你采用了不同的證書,那么系統會要求你的應用程序采用不同的包名稱,在這種情況下相當於安裝了一個全新的應用程序。如果想升級應用程序,簽名證書要相同,包名稱要相同!
- 2.應用程序模塊化: Android系統可以允許同一個證書簽名的多個應用程序在一個進程里運行,系統實際把他們作為一個單個的應用程序,此時就可以把我們的應用程序以模塊的方式進行部署,而用戶可以獨立的升級其中的一個模塊。
- 3.代碼或者數據共享: Android提供了基於簽名的權限機制,那么一個應用程序就可以為另一個以相同證書簽名的應用程序公開自己的功能。以同一個證書對多個應用程序進行簽名,利用基於簽名的權限檢查,你就可以在應用程序間以安全的方式共享代碼和數據了。 不同的應用程序之間,想共享數據,或者共享代碼,那么要讓他們運行在同一個進程中,而且要讓他們用相同的證書簽名。 ————上述內容摘自:android 為什么需要簽名
Android Studio如何打包簽名:
好的,因為學習本課程的都是初學者,多渠道打包的內容以后再進行講解!本節只講最簡單的打包簽名 對了,1中說的調試時默認生成的apk在:app/build/outputs/apk目錄下! 和Eclipse並不相同,Eclipse是在bin目錄下生成的!
好的,打開我們的AS上的Hello World項目,點擊菜單:
①Build -> Generate Signed APK...
②彈出窗口,如果沒有key,就創建一個,有的話就選擇存在的Key
③沒有,我們新建一個,可根據自己需要填寫相關項:
④好的,點擊OK后,可以看到我們密碼的信息,可能需要我們填入密碼了,填寫下:
⑤點擊Next:
⑥點擊Finish稍等一會兒會出現下述提示,說明應用已經打包簽名成功了:
⑦可以看到打包后的APK已經安詳地躺在我們的app目錄下了:
⑧到第七步就已經打包簽名完成了,如果你要驗證是否簽名,只需要輸入下述cmd指令
打包Android APK的方法還有很多,命令行,或者Gradle,ANT,MAVEN等等,方法有很多,本節講解最簡單的通過圖形化界面打包簽名的方式!好了,本節就到這里,最簡單的打包簽名方法get了沒?
----------------------------------------------
4.線程的相關概念
1)相關概念:
- 程序:為了完成特定任務,用某種語言編寫的一組指令集合(一組靜態代碼)
- 進程:運行中的程序,系統調度與資源分配的一個獨立單位,操作系統會 為每個進程分配一段內存空間!程序的依次動態執行,經歷代碼的加載,執行, 執行完畢的完整過程!
- 線程:比進程更小的執行單元,每個進程可能有多條線程,線程需要放在一個 進程中才能執行,線程由程序負責管理,而進程則由系統進行調度!
- 多線程的理解:並行執行多個條指令,將CPU時間片按照調度算法分配給各個 線程,實際上是分時執行的,只是這個切換的時間很短,用戶感覺到"同時"而已!
Service與Thread線程的區別
其實他們兩者並沒有太大的關系,不過有很多朋友經常把這兩個混淆了! Thread是線程,程序執行的最小單元,分配CPU的基本單位! 而Service則是Android提供一個允許長時間留駐后台的一個組件,最常見的 用法就是做輪詢操作!或者想在后台做一些事情,比如后台下載更新! 記得別把這兩個概念混淆!
5.BroadcastReceiver
答:Broadcast直譯廣播,我們舉個形象的例子來幫我理解下BroadcastReceiver,記得以前讀書 的時候,每個班級都會有一個掛在牆上的大喇叭,用來廣播一些通知,比如,開學要去搬書,廣播: "每個班級找幾個同學教務處拿書",發出這個廣播后,所有同學都會在同一時刻收到這條廣播通知, 收到,但不是每個同學都會去搬書,一般去搬書的都是班里的"大力士",這群"大力士"接到這條 廣播后就會動身去把書搬回可是!
——好吧,上面這個就是一個廣播傳遞的一個很形象的例子:
大喇叭--> 發送廣播 --> 所有學生都能收到廣播 --> 大力士處理廣播
回到我們的概念,其實BroadcastReceiver就是應用程序間的全局大喇叭,即通信的一個手段, 系統自己在很多時候都會發送廣播,比如電量低或者充足,剛啟動完,插入耳機,輸入法改變等, 發生這些時間,系統都會發送廣播,這個叫系統廣播,每個APP都會收到,如果你想讓你的應用在接收到 這個廣播的時候做一些操作,比如:系統開機后,偷偷后台跑服務~哈哈,這個時候你只需要為你的應用 注冊一個用於監視開機的BroadcastReceiver,當接收到開機廣播就做寫偷偷摸摸的勾當~ 當然我們也可以自己發廣播,比如:接到服務端推送信息,用戶在別處登錄,然后應該強制用戶下線回到 登陸界面,並提示在別處登錄~當然,這些等下都會寫一個簡單的示例幫大家了解廣播給我們帶來的好處~
讓我們的APP接收系統廣播, 接收之前,還需要為我們的APP注冊廣播接收器哦!而注冊的方法又分為以下兩種:動態與靜態!


BroadcastReceiver的簡單使用就是那么簡單,不過我們這里用到的都是全局廣播,也就是其他 應用也能收到我們的廣播,這樣可能會引起一些安全性問題,不過沒事,下一節我們來教大家如何用 本地廣播
-----------------------------------------------------------------
6.SQLite是什么?
SQLite數據庫,和其他的SQL數據庫不同, 我們並不需要在手機上另外安裝一個數據庫軟件,Android系統已經集成了這個數據庫,我們無需像 使用其他數據庫軟件(Oracle,MSSQL,MySql等)又要安裝,然后完成相關配置,又要改端口之類的!
為什么要用SQLite?SQLite有什么特點?
①SQLite是一個輕量級的關系型數據庫,運算速度快,占用資源少,很適合在移動設備上使用, 不僅支持標准SQL語法,還遵循ACID(數據庫事務)原則,無需賬號,使用起來非常方便!
SQLite支持五種數據類型:NULL,INTEGER,REAL(浮點數),TEXT(字符串文本)和BLOB(二進制對象) 雖然只有五種,但是對於varchar,char等其他數據類型都是可以保存的;因為SQLite有個最大的特點: 你可以各種數據類型的數據保存到任何字段中而不用關心字段聲明的數據類型是什么,
使用SQLite圖形化工具查看db文件 筆者用的是SQLite Expert Professional

進入adb shell,接着鍵入下述指令

--------------------------------------------------
SQLite事務

簡單點說就是:寫在事務里的所有數據庫操作都成功,事務提交,否則,事務回滾,就是回到前面 的狀態——未執行數據庫操作的時候!另外,前面我們也將了,在data/data/<包名>/database/目錄 下除了有我們創建的db文件外,還有一個xxx.db-journal這個文件就是用來讓數據庫支持事務而 產生的 臨時的日志文件!
------------------------------------------------------
-
什么是數據庫版本升級?怎么升級法?
答:假如我們開發了一款APP,里面用到了數據庫,我們假定這個數據庫版本為v1.0, 在這個版本,我們創建了一個x.db的數據庫文件,我們通過onCreate()方法創建了第一個table, t_user,里面有兩個字段:_id,user_id;后面我們想增加一個字段user_name,這個時候 我們就需要對數據庫表的結構進行修改了,而我們可以把更新數據庫的操作梵高onUpgrade() 方法中,我們只需要在實例化自定義SQLiteOpenHelper的時候,修改版本號,比如把1改成2 這樣,就會自動調用onUpgrade()的方法了!另外,對於每個數據庫版本我們都應該做好 相應的記錄(文檔),類似於下面這種:
| 數據庫版本 | andoid對應版本 | 內容 |
|---|---|---|
| v1.0 | 1 | 第一個版本,包含兩個字段... |
| v1.1 | 2 | 數據保留,新增user_name字段 |
-
一些疑問以及相關解決方案,測試時,要關注這些設計變更帶來的影響
①應用升級,數據庫文件是否會刪除?
答:不會!數據什么的都在!
②如果我想刪除表中某個字段或者增加一個新的字段,原先的數據還在嗎?
答:在的!
③比如是這種,假如我們已經升級到第三個版本了,我們在第二個版本增加了一個表, 然后第三個版本也增加了一個表,加入用戶直接從第一個版本升級到第三個版本,這樣 沒經過第二個版本,就沒有增加的那個表,這可怎么破?
答:很簡單,我們可以在onUpgrade()里寫一個switch(),結構如下:
public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int arg2, int arg3) { switch(arg2){ case 1: db.execSQL(第一個版本的建表語句); case 2: db.execSQL(第二個版本的建表語句); case 3: db.execSQL(第三個版本的建表語句); } }細心的你可能發現這里並沒有寫break,這就對了,這是為了保證跨版本升級時,每次數據庫 修改都能全部執行到!這樣可以保證表結構都是最新的!另外不一定是建表語句,修改表結構 也可以哦!
④舊表的設計太糟糕,很多字段要改,改動太多,想建一個新表,但是表名要一樣 而且以前的一些數據要保存到新表中!
答:呵呵,給你跪了,當然,也有解決辦法,下面說下思路:
1.將舊表改名成臨時表: ALTER TABLE User RENAME TO _temp_User;
2.創建新表: CREATE TABLE User (u_id INTEGER PRIMARY KEY,u_name VARCHAR(20),u_age VARCHAR(4));
3.導入數據; INSERT INTO User SELECT u_id,u_name,"18" FROM _temp_User; //原表中沒有的要自己設個默認值
4.刪除臨時表; DROP TABLE_temp_User;
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
7.APP網絡編程之Http協議
現在絕大部分的App都在使用http和https,需要客戶端主動向服務器發送請求,來獲取數據
-
Http 1.0 與 Http 1.1的區別
答:1.0協議,客戶端與web服務器建立連接后,只能獲得一個web資源! 而1.1協議,允許客戶端與web服務器建立連接后,在一個連接上獲取多個web資源!
- 而天誠百微APP使用的基於TCP協議的Socket通信,來維持與服務器的長鏈接,該APP類似及時通信工具(IM)
少部分會有自己的tcp長連接通道,更少部分的app搭配udp通道或者類似QUIC這種reliable UDP協議來提升體驗。不管是什么協議,只要涉及客戶端和服務器的通信,就必然要實現類似https安全握手的流程,部分或者全部,開發者總是在性能和安全性之間取舍。
如果自建長連接使用tcp,udp或者其他網絡協議,也應該實現類似HTTPS的密鑰協商流程。
- 網絡分類:
1.以太網(Ethernet):局域網(local area network,LAN)使用的就是以太網
2.英特網(Internet):廣域網(wide area network,WAN)使用的就是Internet
Internet使用的通信協議是TCP/IP協議,其是一個四層模型:

ARP協議:(Address Resolution Protocol)網絡地址解析協議,我們知道的是IP也是配置在網卡上的,上面又提到網卡有固定的網卡號(MAC地址),實際上IP地址是通過軟件配置在指定網卡上的,通過向局域網發送ARP包能夠返回具體IP配置所在的網卡的MAC地址。【注:獲取網卡MAC地址:#ifconfig,獲取本機IP/MAC地址對應數據:#arp -n】
ICMP協議:(Internet Control Message Protocol)因特網信息控制協議,其是一個錯誤檢測與報告的機制,用於確保網絡的連接狀態,常用的ping與traceroute命令即是使用的此協議,其也需要放到IP包里進行傳輸。
Android與互聯網交互的三種方式

Http協議的底層工作流程:
答:我們先要知道兩個名詞:
- SYN(synchronous):TCP/IP建立連接時使用的握手信號
- ACK(Acknowledgement):確認字符,確認發來的數據已經接受無誤
接着就到TCP/IP三次握手的概念:
- 客戶端發送syn包(syn = j)到服務器,進入SYN_SEND狀態,然后等待服務器確認
- 服務器收到syn包,確認客戶的syn(ack = j + 1),同時在自己也發送一個SYN包(syn=k), 即SYN + ACK包,服務器進入SYN_RECV狀態
- 客戶端收到SYN + ACK包,向服務器發送確認包ACK(ack = k +1),發送完畢后,客戶端與服務端 進入ESTABLISHED狀態,完成三次握手,然后兩者開始傳送數據
如果還不是很清晰,我們再來看三次握手的示意圖:

APP緩存
現在很多門戶類信息網站,比如虎嗅,ifanr,鈦媒體等等的APP,簡單點說是信息閱讀類的APP,很多 都是直接嵌套一個WebView用來顯示相關資訊的,這可能就涉及到了WebView的緩存了!
所謂的頁面緩存 就是指:保存加載一個網頁時所需的HTML,JS,CSS等頁面相關的數據以及其他資源,當沒網的時候或者 網絡狀態較差的時候,加載本地保存好的相關數據!而實現這個緩存的方式有兩種,一種是后台寫一個 下載的Service,將文章相關的數據按自己的需求下載到數據庫或者保存到相應文件夾中,然后下次加載 對應URL前先判斷是否存在本地緩存,如果存在優先加載本地緩存,不存在則執行聯網請求,同時緩存 相關資源,典型的如舊版本的36Kr,在進去后會先離線文章,然后再顯示!
當然,本節要講解的不是 這種自己寫邏輯的方式,而是通過WebView本身自帶的緩存功能來緩存頁面,這種方式使用起來非常 簡單,我們只需為WebView設置開啟相關功能,以及設置數據庫的緩存路徑即可完成緩存!
--------------------------------------------------------------------------------------------------
Json是什么?
答:JavaScript Object Natation, 一種輕量級的數據交換格式, 與XML一樣, 廣泛被采用的客戶端和服務端交互的解決方案!具有良好的可讀和便於快速編寫的特性。
--------------------------------------------------------------------------------------------------------------------------------------------------------
8.APP網絡編程之Socket網絡基礎
故需要對數據傳給服務器,在服務器端做處理。
網絡協議有幾層?那么IP協議在哪層?Socket是什么鬼? 分哪幾種?TCP和UDP協議又在哪層?有什么區別...嗯,這...所以學習本節概念性的理論還是很有 必要的!
七層模型每層叫 什么,大概拿來干嘛,還有TCP三次握手和四次揮手
OSI七層網絡模型(從下往上):
- 物理層(Physical):設備之間的數據通信提供傳輸媒體及互連設備,為數據傳輸提供可靠的 環境。可以理解為網絡傳輸的物理媒體部分,比如網卡,網線,集線器,中繼器,調制解調器等! 在這一層,數據還沒有被組織,僅作為原始的位流或電氣電壓處理,這一層的單位是:bit比特
- 數據鏈路層(Datalink):可以理解為數據通道,主要功能是如何在不可靠的物理線路上進行 數據的可靠傳遞,改層作用包括:物理地址尋址,數據的成幀,流量控制,數據檢錯以及重發等! 另外這個數據鏈路指的是:物理層要為終端設備間的數據通信提供傳輸媒體及其連接。媒體是 長期的,連接是有生存期的。在連接生存期內,收發兩端可以進行不等的一次或多次數據通信。 每次通信都要經過建立通信聯絡和拆除通信聯絡兩過程!這種建立起來的數據收發關系~ 該層的設備有:網卡,網橋,網路交換機,另外該層的單位為:幀
- 網絡層(Network):主要功能是將網絡地址翻譯成對應的物理地址,並決定如何將數據從發 送方路由到接收方,所謂的路由與尋徑:一台終端可能需要與多台終端通信,這樣就產生的了 把任意兩台終端設備數據鏈接起來的問題!簡單點說就是:建立網絡連接和為上層提供服務! 該層的設備有:路由!該層的單位為:數據包,另外IP協議就在這一層!
- 傳輸層(Transport):向上面的應用層提供通信服務,面向通信部分的最高層,同時也是 用戶功能中的最低層。接收會話層數據,在必要時將數據進行分割,並將這些數據交給網絡 層,並且保證這些數據段有效的到達對端!所以這層的單位是:數據段;而這層有兩個很重要 的協議就是:TCP傳輸控制協議與UDP用戶數據報協議,這也是本章節核心講解的部分!
- 會話層(Session):負責在網絡中的兩節點之間建立、維持和終止通信。建立通信鏈接, 保持會話過程通信鏈接的暢通,同步兩個節點之間的對話,決定通信是否被中斷以及通信中斷時 決定從何處重新發送,即不同機器上的用戶之間會話的建立及管理!
- 表示層(Presentation):對來自應用層的命令和數據進行解釋,對各種語法賦予相應 的含義,並按照一定的格式傳送給會話層。其主要功能是"處理用戶信息的表示問題,如編碼、 數據格式轉換和加密解密,壓縮解壓縮"等
- 應用層(Application):OSI參考模型的最高層,為用戶的應用程序提供網絡服務。 它在其他6層工作的基礎上,負責完成網絡中應用程序與網絡操作系統之間的聯系,建立與結束使用者之間的聯系,並完成網絡用戶提出的各種網絡服務及應用所需的監督、管理和服務等各種協議。此外,該層還負責協調各個應用程序間的工作。應用層為用戶提供的服務和協議有:文件服務、目錄服務、文件傳輸服務(FTP)、遠程登錄服務(Telnet)、電子郵件服務(E-mail)、打印服務、安全服務、網絡管理服務、數據庫服務等。
好的上面我們淺述了OSI七層網絡模型,下面總結下:
OSI是一個理想的模型,一般的網絡系統只涉及其中的幾層,在七層模型中,每一層都提供一個特殊 的網絡功能,從網絡功能角度觀察:
- 下面4層(物理層、數據鏈路層、網絡層和傳輸層)主要提供數據傳輸和交換功能, 即以節點到節點之間的通信為主
- 第4層作為上下兩部分的橋梁,是整個網絡體系結構中最關鍵的部分;
- 上3層(會話層、表示層和應用層)則以提供用戶與應用程序之間的信息和數據處理功能為主。
簡言之,下4層主要完成通信子網的功能,上3層主要完成資源子網的功能。
2.TCP/IP四層模型

TCP/IP是一組協議的代名詞,它還包括許多協議,組成了TCP/IP協議簇。這4層分別為:
- 應用層:應用程序間溝通的層,如簡單電子郵件傳輸(SMTP)、文件傳輸協議(FTP)、 網絡遠程訪問協議(Telnet)等。
- 傳輸層:在此層中,它提供了節點間的數據傳送服務,如傳輸控制協議(TCP)、 用戶數據報協議(UDP)等,TCP和UDP給數據包加入傳輸數據並把它傳輸到下一層中, 這一層負責傳送數據,並且確定數據已被送達並接收。
- 網絡互連層:負責提供基本的數據封包傳送功能,讓每一塊數據包都能夠到達目 的主機(但不檢查是否被正確接收),如網際協議(IP)。
- 主機到網絡層:對實際的網絡媒體的管理,定義如何使用實際網絡 (如Ethernet、Serial Line等)來傳送數據。
3.TCP/UDP區別講解
接下來要講的是 和我們Socket開發相關的一些概念名詞了!
1)IP地址

2)端口
1. 用於區分不同的應用程序
2. 端口號的范圍為0-65535,其中0-1023未系統的保留端口,我們的程序盡可能別使用這些端口!
3. IP地址和端口號組成了我們的Socket,Socket是網絡運行程序間雙向通信鏈路的終結點, 是TCP和UDP的基礎!
4. 常用協議使用的端口:HTTP:80,FTP:21,TELNET:23

3)TCP協議與UDP協議的比較:
TCP協議流程詳解:
首先TCP/IP是一個協議簇,里面包括很多協議的。UDP只是其中的一個。之所以命名為TCP/IP協議, 因為TCP,IP協議是兩個很重要的協議,就用他兩命名了。
下面我們來講解TCP協議和UDP協議的區別:
TCP(Transmission Control Protocol,傳輸控制協議)是面向連接的協議,即在收發數據錢 ,都需要與對面建立可靠的鏈接,這也是面試經常會問到的TCP的三次握手以及TCP的四次揮手! 三次握手: 建立一個TCP連接時,需要客戶端和服務端總共發送3個包以確認連接的建立, 在Socket編程中,這一過程由客戶端執行connect來觸發,具體流程圖如下:
- 第一次握手:Client將標志位SYN置為1,隨機產生一個值seq=J,並將該數據包發送給Server, Client進入SYN_SENT狀態,等待Server確認。
- 第二次握手:Server收到數據包后由標志位SYN=1知道Client請求建立連接,Server將標志位 SYN和ACK都置為1,ack=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之間可以 開始傳輸數據了。
四次揮手: 終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務端總共發送4個包以確認連接的斷開。 在Socket編程中,這一過程由客戶端或服務端任一方執行close來觸發,具體流程圖如下:
- 第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入 FIN_WAIT_1狀態
- 第二次揮手:Server收到FIN后,發送一個ACK給Client,確認序號為收到序號+1(與SYN相同, 一個FIN占用一個序號),Server進入CLOSE_WAIT狀態。
- 第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK 狀態。
- 第四次揮手:Client收到FIN后,Client進入TIME_WAIT狀態,接着發送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。 另外也可能是同事發起主動關閉的情況:
另外還可能有一個常見的問題就是:為什么建立連接是三次握手,而關閉連接卻是四次揮手呢? 答:因為服務端在LISTEN狀態下,收到建立連接請求的SYN報文后,把ACK和SYN放在一個報文里 發送給客戶端。而關閉連接時,當收到對方的FIN報文時,僅僅表示對方不再發送數據了但是還 能接收數據,己方也未必全部數據都發送給對方了,所以己方可以立即close,也可以發送一些 數據給對方后,再發送FIN報文給對方來表示同意現在關閉連接,因此,己方ACK和FIN一般都會 分開發送。
UDP協議詳解:
UDP(User Datagram Protocol)用戶數據報協議,非連接的協議,傳輸數據之前源端和終端不 建立連接,當它想傳送時就簡單地去抓取來自應用程序的數據,並盡可能快地把它扔到網絡上。 在發送端,UDP傳送數據的速度僅僅是受應用程序生成數據的速度、計算機的能力和傳輸帶寬 的限制;在接收端,UDP把每個消息段放在隊列中,應用程序每次從隊列中讀一個消息段。 相比TCP就是無需建立鏈接,結構簡單,無法保證正確性,容易丟包
——上述內容部分摘自:














