網絡Http和Socket通訊(基于面試)

每日一句:想得到世上最好的東西,先得讓世界看到最好的你

目錄

面試問OSI或TCP/IP,怎么回答?

面試問HTTP?

面試問Get類型,Pot類型區別?

面試什么是Socket套接字?

面試問什么是數據粘包?

粘包產生原因?

面試問什么是數據分包?

分包產生的原因就簡單的多:

粘包與分包的處理方法:

為什么UDP沒有粘包?

一組數據包的聲明周期過程?

心跳包


客戶端發“hello”經過OSI每一層都加一個協議頭,封裝成報,通過連接到互聯網,物理層發送到服務端,接到后,再把一層層頭去掉,得到“hello”

面試問OSI或TCP/IP,怎么回答?

  1. 網絡的傳輸層次結構
  2. OSI——>簡化TCP/IP模型,把應用,表示,會話——>合成應用層
  3. 每層經典數據協議

HTTP協議請求時,有請求頭,響應頭

客戶端首先發一個請求協議,發送到服務端回一個響應協議

*TCP短鏈接

在每次傳輸時都會建立一個通訊信道,傳輸后關閉連接。關閉后服務器就找不到客戶端了,需要待下一個客戶端發起連接時才能找到

TCP長連接

客戶端和服務端一開始會連接,并一直保持,直到不再交換數據斷開。

UDP無連接,直接數據報投給你

區別:

  1. 長連接一直連接,服務器可隨時向客戶端發數據,短連接不可以
  2. 短鏈接性能消耗大

帶寬計算 運營商 比特 ?個體 字節

通訊協議

IP協議 用于網絡定位的一個數據串

TCP協議

  1. 服務器開始接收
  2. 客戶端發送連接請求
  3. 如果達到服務端,服務端給相應

面試問HTTP?

是超文本傳輸協議,位于應用層,基于TCP協議開發。特點是傳輸時,有數據完整性校驗(校驗數據在頭部信息中)

面試問HTTPS?

加密后的HTTP協議

  1. 敏感數據傳參,加密數據更安全
  2. 防釣魚網站

HTTP協議構成

URL結構

通訊協議::Http:// ?Https://

主機地址:IP,域名

端口號:80端口提供Http服務,443端口提供Https服務

目錄:“/目錄名”

腳本名稱

URL參數

“?參數名=參數值&參數名=參數值”

?URL地址可以進行偽裝

HTTP狀態號

200成功

301重定向(當前網頁已過時,跳轉到新頁面)

403當前目錄禁止訪問

404網頁不存在

500服務器內部錯誤

502訪問量過大,不能提供服務

HTTP請求類型

Get類型 僅作網頁請求連接

Post類型 用戶名登錄時,要作表單數據類型發送

面試問Get類型,Pot類型區別?

  1. Get類型通過URL地址傳遞的;Post類型數據通過HTTP數據頭傳遞的
  2. Get類型會被記錄下來,Post類型相對安全
  3. Get類型傳遞數據長度受URL限制;Post可以傳遞任意長度數

如果需要在URL傳遞數據中加入特殊字符,需要對數據進行URL編碼

TCP長連接

面試什么是Socket套接字?

套接字是將IP地址與主機端口號合并在一起后的數據,IP地址定位主機位置,端口號知道通訊入口與出口,從而實現主機的數據交換

Socket基于傳輸層實現

TCP編程方式(c#)

連接(三次握手)——>斷開(四次揮手)——>監聽,綁定(服務器開發)——>接收——>發送

發送數據含頭部信息,網卡里有緩存,累積之后再發怎么處理

數據包處理

面試問什么是數據粘包?

TCP協議中,發送方發送的若干包數據到接收方接收時粘成一包,從接收緩沖區看,后一包數據的頭緊接著前一包數據的尾。

發送數據前,如果有多個數據包要一起發送,則可以將數據包拼在一起發送,這樣效率更高

粘包產生原因?

先說TCP:由于TCP協議本身的機制(面向連接可靠的協議,三次握手四次揮手)客戶段與服務端會建立一個鏈接,數據在鏈接不斷開的情況下,可以持續不斷地將多個數據包發往服務端,相當于一個流,但是如果發送的網絡數據包太小,那么他本身會啟用Nagle算法(當然是可配置是否啟用)對較小的數據包進行合并(基于此,TCP的網絡延遲要UDP的高些,因為需要合并延時發送)然后再發送(超時或者包大小足夠)。這樣的話,服務端在接收到消息(數據流)的時候就無法區分哪些數據包是客戶端自己分開發送的,這樣產生了粘包;還有一種情況,服務端在接收到數據后,然后放到緩沖區中,如果消息沒有被及時從緩存區取走,下次在取數據的時候可能就會出現一次取出多個數據包的情況,造成粘包現象(確切來講,對于基于TCP協議的應用,不應用包來描述,而應該用流的概念來描述)

面試問什么是數據分包?

當接到數據后,需要將每一個定制的數據格式分離出來,所寫的代碼就是分包代碼,有時服務器是硬件將拼接在一起,有時是代碼將數據包拼接在一起,拼接后的代碼,效率更高

分包產生的原因就簡單的多:

可能是IP分片傳輸導致的,也可能是傳輸過程中丟失部分包導致出現的半包,還有可能就是一個包可能被分成了兩次傳輸,在取數據的時候,先取到了一部分(還可能與接收的緩沖區大小有關系),總之就是一個數據包被分成了多次接收。

粘包與分包的處理方法:

一個是采用分隔符的方式,即我們在封裝要發送的數據包的時候,采用固定的字符作為結尾符(數據中不能含結尾符),這樣我們接收到數據包后,如果出現結尾標識,即人為的將粘包分開,如果一個包中沒有出現結尾符,認為出現了分包,則等待下個包中出現后 組合成一個完整的數據包,這種方式適合于文本傳輸的數據,如采用/r/n之類的分隔符;

另一種是采用在數據包中添加長度的方式,即在數據包中的固定位置封裝數據包的長度信息(或可計算數據包總長度的信息),服務器接收到數據后,先是解析包長度,然后根據包長度截取數據包(此種方式常出現于自定義協議中),但是有個小問題就是如果客戶端第一個數據包數據長度封裝的有錯誤,那么很可能就會導致后面接收到的所有數據包都解析出錯(由于TCP建立連接后流式傳輸機制),只有客戶端關閉連接后重新打開才可以消除此問題,我在處理這個問題的時候對數據長度做了校驗,會適時的對接收到的有問題的包進行人為的丟棄處理(客戶端有自動重發機制,故而在應用層不會導致數據的不完整性);

為什么UDP沒有粘包?

粘包拆包問題在數據鏈路層、網絡層以及傳輸層都有可能發生。日常的網絡應用開發大都在傳輸層進行,由于UDP有消息保護邊界,不會發生粘包拆包問題,因此粘包拆包問題只發生在TCP協議中。

打包

對原始數據添加協議頭的過程

解包

接收到數據包時,讀取包頭,并記錄信息,獲取到包內原始數據的過程

一組數據包的聲明周期過程?

  1. 對原始數據打包
  2. 對多個數據包粘包
  3. 套接字(連接,發送)
  4. 套接字(接收)
  5. 有可能同時接收到多個數據黏在一起,對數據進行(分包)
  6. 取得單個數據的原始數據(解包)
  7. 根據數據包,執行代碼邏輯

數據包定制

包頭:記錄有關于整個數據包的信息(可加密)

包體:原始數據(可加密)

字節序(存在于數字存儲方法)
小端字節序:將數據的后位字節,放在內存棧的低地址位

大端字節序:將數據的后位字節,放在內存棧的高地址位

主機字節序:當前計算機數字的字節表示方式

網絡字節序:互聯網規定,傳遞數據時,都轉大端字節序

字符串內有字節序問題,它受字符編碼影響

心跳包

因為TCP是有連接的,所以必須在兩個PC間建立連接,但是如果長時間連接卻又不發送數據,則會占用互聯網的通信信道,就有可能被網絡的中間設備(路由器,防火墻)將網絡連接斷開,所以防止網絡被斷開,則需要兩臺計算機間定期發送一些數據,這樣的數據就是心跳數據

網絡延遲計算:服務器返回心跳時間-客戶端發送心跳時間

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10086.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10086.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10086.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

qt for android 的架構原理

qt for android實現架構,分享這幾幅很不錯圖。來自于 《Qt 林斌:整合Android IVI平臺打造統一的Qt數字座艙體驗》 1.實現架構圖 2.qt for android能力 3.java 和 qt混合開發 4. AutoMotive

46寸硅片為什么要留平邊(flat)?

知 識星球(星球名: 芯片制造與封測社區,星球號: 63559049)里的學員問: 2, 4, 6寸硅片都有 平 邊,它們有什么作用 ? 硅片的平邊(Flat&…

經典權限五張表案例分析

文章目錄 模塊分析模塊分析 描述五張表的關系重要知識講解抽取成一個BaseServletSpringIOC思想(底層)實現代碼IOC概述 SPI機制(為學習框架做思想和技術鋪墊)SPI引入1. 標準/規范2. 具體的實現3. 調用 SPI介紹SPI練習JDBC4.0免注冊驅動原理Servlet實現方式三 ServletContainerIn…

idea使用前的全局配置,一次配置,多次使用

前提:每次導入一個新的項目,就需要重新設置編碼、maven、jdk、git版本等信息。實際每個項目所用到的配置信息是一致的,除非換一家公司,不然不會改動到這些內容。 idea版本:2024.1.1 1.1、全局Maven配置 IDEA啟動頁面…

微火一文盤點:為何全域運營系統會成為創業新風口?

當前,微火全域運營已經成為創業的新風口,想要做微火全域運營服務商的創業者數量日益增多。據目前了解到的最新消息,微火全域運營系統的市場占有率已經超過了48%,并且還在持續不斷地上漲中。 所謂微火全域運營系統,就是…

InLine Chat功能優化對標Github Copilot,CodeGeeX帶來更高效、更直觀的編程體驗!

VSCode中的CodeGeeX 插件上線InLine Chat功能后,收到不少用戶的反饋,大家對行內交互編程這一功能非常感興趣。近期我們針對這個功能再次進行了深度優化,今天詳細介紹已經在VSCode插件v2.8.0版本上線的 CodeGeeX InLine Chat功能,以…

藍橋杯成績已出

藍橋杯的成績早就已經出來了,雖然沒有十分驚艷 ,但是對于最終的結果我是心滿意足的,感謝各位的陪伴,關于藍橋杯的刷題筆記我已經堅持更新了49篇,但是現在即將會告別一段落,人生即將進入下一個規劃。我們一起…

Spring框架學習筆記(一):Spring基本介紹(包含IOC容器底層結構)

1 官方資料 1.1 官網 https://spring.io/ 1.2 進入 Spring5 下拉 projects, 進入 Spring Framework 進入 Spring5 的 github 1.3 在maven項目中導入依賴 <dependencies><!--加入spring開發的基本包--><dependency><groupId>org.springframework<…

jni 返回二維byte數組

在JNI中返回二維byte數組&#xff0c;你需要在Java中準備一個相應的二維數組來接收這個返回值。在JNI層面&#xff0c;你可以創建一個二維的byte數組&#xff0c;并使用GetByteArrayRegion和SetByteArrayRegion來操作它。 以下是一個簡單的例子&#xff1a; public class Jni…

基于STC12C5A60S2系列1T 8051單片機實現一主單片機與一從單片機進行雙向串口通信功能

基于STC12C5A60S2系列1T 8051單片機實現一主單片機與一從單片機進行雙向串口通信功能 STC12C5A60S2系列1T 8051單片機管腳圖STC12C5A60S2系列1T 8051單片機串口通信介紹STC12C5A60S2系列1T 8051單片機串口通信的結構基于STC12C5A60S2系列1T 8051單片機串口通信的特殊功能寄存器…

QT---day5,通信

1、思維導圖 2、TCp 服務器 #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QTcpServer> #include <QList> #include <QTcpSocket> #include <QMessageBox> #include <QDebug> #include <QTcpServer> QT_B…

鐳速實現利用Libarchive實現高效、智能的文件傳輸和管理

在前一篇報道中&#xff0c;我們闡述了Libarchive這一開源庫的強大功能&#xff0c;它專門用于處理歸檔文件。通過整合Libarchive&#xff0c;鐳速在包括Windows和Linux在內的多個操作系統上提供了在線解壓縮服務&#xff0c;為企業構建了一個既強大又安全的文件傳輸系統&#…

【代碼分享】使用HTML5的Canvas繪制編碼說明圖片

最急在工作中遇到一個需求&#xff0c;根據給定的編碼生成編碼說明&#xff0c;像下面這樣的效果。 不同含義的編碼用橫杠分割&#xff0c;然后每個編碼下面用箭頭指明具體的含義。下面是我使用canvas實現的代碼。具體的編碼寬度大家可以根據實際情況進行調整&#xff0c;目前…

Ranger 面試題及答案整理,最新面試題

Ranger 的安全模型是如何設計的&#xff1f; Ranger的安全模型設計主要基于訪問控制和安全策略的管理&#xff0c;它通過以下幾個關鍵組件實現&#xff1a; 1、策略管理&#xff1a; Ranger 提供了一個中央管理平臺&#xff0c;用于定義、更新和管理安全策略。這些策略根據資…

基于RT-Thread的HC-SR04超聲波驅動

前言 本次驅動用的是這款超聲波&#xff0c;超聲波的驅動大同小異&#xff0c;均可參考 一、引腳定義 引腳功能VCC接直流5V電TRIG接外部電路的TRIG端&#xff0c;向此引腳輸入10us以上的高電平可觸發超聲波測距ECHO接外部電路的ECHO端&#xff0c;測距結束時該引腳會輸出一…

Python框架Django入門教程

Django 是一個使用 Python 編程語言開發的、免費且開源的 Web 應用框架。它遵循 "DRY&#xff08;Dont Repeat Yourself&#xff09;" 原則&#xff0c;旨在簡化創建功能豐富的、高效率的 Web 網站。Django 提供了模型-視圖-控制器&#xff08;MVC&#xff09;架構的…

時尚圈的節制美學 — 奧柔拉 AVRALA的獨特設計理念

在這個多元化的時代&#xff0c;女性正在經歷一場前所未有的角色變革。她們不再僅僅滿足于傳統的社會角色&#xff0c;而是勇敢地追求個人職業發展和自我實現。在這樣的背景下&#xff0c;服飾不僅僅是外在的裝飾&#xff0c;更是內心故事的講述者、個性自我的表達者、身份歸屬…

KaiOS Data PDN 數據建立流程

代碼邏輯 APN創建 在 DataCallManager.jsm中,會對所有apnsetting創建一個datacall,其中會包含dataprofile的成員(通過apn參數來創建),在之后的流程用于直接發送到modem建立PDN。 PDN建立 1、DataCallManager.jsm -dcInterface.setupDataCall //RILNetworkInterface.c…

C語言內存泄漏及檢測方法

目錄 1. 內存泄漏概述 1.1 內存泄漏定義 1.2 內存泄漏的危害 1.3 內促泄漏的原因 2. C語言中的內存管理 2.1 C語言內存分配方式 2.2 C語言內存管理函數 2.3 動態內存管理注意事項 3. 內存泄漏的檢測與定位 3.1 內存泄漏檢測工具 3.2 內存泄漏定位方法 3.3 內存泄漏…