爬蟲_小結03


一、tcp和udp的區別?
  一、TCP面向鏈接(如打電話要先撥號創建鏈接);UDP是無鏈接的,即發送數據以前不須要創建鏈接
  二、TCP提供可靠的服務。也就是說,經過TCP鏈接傳送的數據,無差錯,不丟失,不重複,
  且按序到達;UDP盡最大努力交付,即不保證可靠交付
  三、TCP面向字節流,其實是TCP把數據當作一連串無結構的字節流;UDP是面向報文的
  UDP沒有擁塞控制,所以網絡出現擁塞不會使源主機的發送速率下降(對實時應用頗有用,如IP電話,實時視頻會議等)
  四、每一條TCP鏈接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通訊
  五、TCP首部開銷20字節;UDP的首部開銷小,只有8個字節
  六、TCP的邏輯通訊信道是全雙工的可靠信道,UDP則是不可靠信道

TCP三次握手過程:
  第一次握手:客戶端(client)發送SYN包到服務器(server),
  客戶端(client)狀態機進入SYN_SEND狀態,等待服務器確認;
  第二次握手:服務器(server)接收到SYN包,必須發送ACK包到客戶端,
  同時本身也發送一個SYN包,即SYN+ACK包,此時服務器進入SYN_RECV狀態;
  第三次握手:客戶端(client)接收到服務器發送的SYN+ACK包,
  必須向服務器發送確認包ACK,此包發送成功,則客戶端和服務器同時進入ESTABLISHED狀態。

3次握手的特色:
  沒有應用層的數據
  SYN這個標誌位只有在TCP建產鏈接時纔會被置1
  握手完成後SYN標誌位被置0

TCP創建鏈接要進行3次握手,而斷開鏈接要進行4次

四次揮手:
  假設客戶端發起斷開鏈接請求,
  第一次揮手:客戶端(client)發送FIN報文到Server端
  第二次揮手:服務器(server)收到客戶端發送的FIN包以後,發送ACK包到客戶端,
  客戶端收到服務器發送的ACK以後,進入FIN_WAIT狀態,等待server端發送FIN報文
  第三次揮手:服務器(server)發送FIN報文到客戶端
  第四次揮手:客戶端收到服務器發送的FIN報文以後,發送ACK包到服務器,
  服務器收到ACK以後即斷開鏈接,等待一段時間TIME_WAIT以後,
  客戶端發現服務器沒有再發FIN過來,就知道服務器已經斷開鏈接,此時客戶端也進入斷開鏈接狀態。python

名詞解釋:
   ACK TCP報頭的控制位之一,對數據進行確認.確認由目的端發出,用它來告訴發送端這個序列號以前的數據段都收到了.
好比,確認號爲X,則表示前X-1個數據段都收到了,只有當ACK=1時,確認號纔有效,當ACK=0時,確認號無效,這時會要求重傳數據,保證數據的完整性.
  SYN 同步序列號,TCP創建鏈接時將這設置爲1   
  FIN 發送端完成發送任務位,當TCP完成數據傳輸須要斷開時,提出斷開鏈接的一方將這設置爲1數組

二、對內存中棧和堆的瞭解?
  棧(stacks):棧的特色是後進先出。只能經過訪問一端來實現數據的儲存和檢索的線性數據結構。
  a、棧的伸長和伸縮就是函數壓入或者推出局部變量。
  b、咱們不用本身去管理內存,變量建立和釋放都是自動的。
  c、棧中的變量只有在函數建立運行時存在。
  堆:
  堆也是咱們的計算機內存中的一個區域,可是他不是自動管理的。並且也不是被CPU密切的管理着。
  它是一片更加自由的內存區域(很大)。要想在堆上建立內存,咱們必須使用malloc() 或者calloc(),
  他們都是C語言編譯的。一旦你在堆上分配內存,當你不在須要的時候你必須用free()去銷燬。若是你不銷燬或者銷燬失敗,
  你的程序就會有內存泄露。換句話說就是堆內存會一直在,其餘進程沒法使用。
  不像棧,堆沒有變量大小的限制(除了你電腦的物理限制條件外)。堆內存讀出和寫入都比較慢,由於它必須使用指針圖訪問堆內存。
  服務器

  棧和堆的優缺點:
  棧:
  a、快速訪問。
  b、沒有必要明確的建立分類變量,由於它是自動管理的。
  c、空間被CPU高效地管理着,內存不會變成碎片。
  d、只有局部變量
  e、受限於棧大小(取決於操做系統)
  f、變量不能調整大小。
  堆:
  a、變量能夠被全局訪問
  b、沒有內存大小限制
  c、(相對)訪問比較慢
  d、沒有高效地使用空間,隨着塊內存的建立和銷燬,內存可能會變成碎片。
  e、你必須管理內存(變量的建立和銷燬你必需要負責)
  f、變量大小能夠用realloc( )調整網絡

 

3.字典、列表查詢時的時間複雜度是怎樣的?  
  列表是序列,能夠理解爲數據結構中的數組,字典能夠理解爲數據結構中的hashmap,python中list對象的存儲結構採用的是線性表,
  所以其查詢複雜度爲O(n),而dict對象的存儲結構採用的是散列表(hash表),其在最優狀況下查詢複雜度爲O(1)。dict的佔用內存稍比list大,
  會在1.5倍左右。

四、遞歸中若是沒有終止條件會怎樣?
  遞歸若是沒有終止條件會致使遞歸調用成爲死循環而不能正常結束,而且會形成棧溢出數據結構

5.去除列表中的重複元素
  list1 = [12,12,13,14,15,6,7,6,8,9,3,3,13]app

  # list1 = list(set(list1))
  # print(list1)

def distinct_list(list):
  d_l = []
  for i in list1:
    if i not in d_l:
    d_l.append(i)
  return d_l

ret = distinct_list(list1)
print(ret)tcp

相關文章
相關標籤/搜索