數據庫引擎開發以及常見數據庫內部原理學習(3):網絡編程基礎

康奈爾筆記java

線索
  • 網絡理論
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  • 程序流程
1.記錄:
  1. 網絡原理
    • 計算機網路是一種容許計算機進行即時通信的工具
    • 計算機物理鏈接多是電纜也多是無線介質
    • 生成、轉發以及銷燬數據的網絡設備稱之爲網絡節點
  2. OSI模型
    • 國際標準協議OSI模型是一種字面模型,並且跟IP協議不要緊
    • 第一層:物理層:bit流傳輸,主要是物理介質
    • 第二層:數據鏈路層:提供介質訪問,鏈路管理,各類鏈路轉換
    • 第三層:網絡層:尋址和路由的選擇,路由器,轉換尋址,路由器
    • 第四層:傳輸層:創建主機端到端的鏈接,4層,0保障最少,3最多
    • 第五層:會話層:創建、維護和管理會話,創建的檢查點等機制
    • 第六層:表示層:處理數據格式、數據加密,提供與應用分離的格式
    • 第七層:應用層:提供應用程序間通訊,識別資源模式
  3. IP協議
    • 爲計算機網絡相互鏈接進行通信而設計的協議
    • 是一套由軟件、程序所組成的協議,把各類系統不一樣的信息轉換成統一的格式,使全部的網絡節點能實現互通。
    • 第一層:鏈路層
    • 第二層:鏈接層,IPV四、IPV6
    • 第三層:傳輸層
    • 第四層:應用層
  4. TCP協議
    • TCP協議是IP協議組件中最重要的組成部分
    • TCP基於IP協議,提供了可靠,有序,錯誤校驗的數據流,用於局域網和廣域網中程序之間的信息交換。
    • 坐落於IP協議的傳輸層
  5. Socket套接字
    • 程序間通信流的終端,客戶端使用套接字進行通信。
    • 套接字API是一種應用程序開發接口,通常由操做系統提供。(通常指廣域網套接字)
    • 通常爲IP地址與端口的結合
    • 組成:本地IP、遠程IP、協議
  6. 程序流程
    • 客戶端流程:創建套接字-鏈接服務器-進行通信-關閉套接字
    • 服務端流程:創建套接字-監聽-接收鏈接請求-進行通信-接收客戶端關閉套接字信息-關閉套接字
  7. 函數接口
    • socket()建立一個新的套接字並分配系統資源
    • bind()通常用於服務端,將套接字與套接字地址(例如本地端口以及IP地址)綁定
    • listen() 通常用於服務端,將綁定的TCP置於監聽狀態
    • connect() 通常用於客戶端,分配一個本地的空閒端口,而且與遠程地址創建鏈接
    • accept() 通常用於服務端,接受一個新的鏈接請求,並建立一個與該連接綁定的套接字
    • send() 與 recv(), 或 write() 與read(), 或sendto() 與recvfrom()用於發送和接收數據
    • close() 關閉一個打開的套接字並釋放資源
    • gethostbyname() 與gethostbyaddr() 在IPv4協議中解析域名和地址
    • select() 用於等待一個或多個指定套接字的下一個讀寫事件
    • poll()用於測試一個或多個套接字的讀寫狀態
    • getsockopt() 獲得指定套接字的參數
    • setsockopt() 配置指定套接字的參數
  8. 典型服務端
      1. int main(void)
      2. {
      3. //套接字地址
      4. struct sockaddr_instSockAddr;
      5. //創建套接字
      6. intSocketFD= socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
      7. //判斷套接字是否成功
      8. if(-1==SocketFD)
      9. {
      10. perror("can not create socket");
      11. exit(EXIT_FAILURE);
      12. }
      13. //重置套接字地址信息
      14. memset(&stSockAddr,0,sizeof(stSockAddr));
      15. stSockAddr.sin_family= AF_INET;
      16. stSockAddr.sin_port= htons(1100);
      17. stSockAddr.sin_addr.s_addr= htonl(INADDR_ANY);
      18. //綁定端口
      19. if(-1== bind(SocketFD,(structsockaddr*)&stSockAddr,
      20. sizeof(stSockAddr)))
      21. {
      22. perror("error bind failed");
      23. close(SocketFD);
      24. exit(EXIT_FAILURE);
      25. }
      26. //監聽端口
      27. if(-1== listen(SocketFD,10))
      28. {
      29. perror("error listen failed");
      30. close(SocketFD);
      31. exit(EXIT_FAILURE);
      32. }
      33. //循環
      34. for(;;)
      35. {
      36. //監聽鏈接
      37. intConnectFD= accept(SocketFD, NULL, NULL);
      38. if(0>ConnectFD)
      39. {
      40. perror("error accept failed");
      41. close(SocketFD);
      42. exit(EXIT_FAILURE);
      43. }
      44. /* perform read write operations ...
      45. read(ConnectFD,buff,size)*/
      46. if(-1== shutdown(ConnectFD, SHUT_RDWR))
      47. {
      48. perror("can not shutdown socket");
      49. close(ConnectFD);
      50. close(SocketFD);
      51. exit(EXIT_FAILURE);
      52. }
      53. close(ConnectFD);
      54. }
      55. close(SocketFD);
      56. return EXIT_SUCCESS;
      57. }
  9. 典型客戶端
      1. int main(void)
      2. {
      3. struct sockaddr_instSockAddr;
      4. intRes;
      5. intSocketFD= socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
      6. if(-1==SocketFD)
      7. {
      8. perror("cannot create socket");
      9. exit(EXIT_FAILURE);
      10. }
      11. memset(&stSockAddr,0,sizeof(stSockAddr));
      12. stSockAddr.sin_family= AF_INET;
      13. stSockAddr.sin_port= htons(1100);
      14. Res= inet_pton(AF_INET,"192.168.1.3",&stSockAddr.sin_addr);
      15. }
      16. if(0>Res)
      17. {
      18. perror("error: first parameter is not a valid address family");
      19. close(SocketFD);
      20. exit(EXIT_FAILURE);
      21. }
      22. elseif(0==Res)
      23. {
      24. perror("char string (second parameter does not contain valid
      25. ipaddress)");
      26. close(SocketFD);
      27. exit(EXIT_FAILURE);
      28. }
      29. if(-1== connect(SocketFD,(struct sockaddr*)&stSockAddr,
      30. sizeof(stSockAddr)))
      31. {
      32. perror("connect failed");
      33. close(SocketFD);
      34. exit(EXIT_FAILURE);
      35. }
      36. /* perform read write operations ... */
      37. (void) shutdown(SocketFD, SHUT_RDWR);
      38. close(SocketFD);
      39. return EXIT_SUCCESS;
      40. }
2.簡化:
  1. 計算機網絡是一種容許計算機通信的工具。
  2. OSI模型是一種標準化的字面模型,沒有真正的普遍運用,其包括:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層。
  3. IP網絡互聯協議是一種被普遍運用的互聯網協議,主要包括:鏈路層、鏈接層、傳輸層、應用層。
  4. TCP基於IP協議,提供了可靠,有序,錯誤校驗的數據流,是普遍運用與程序中間的。
  5. 套接字是一種通常由系統提供的應用程序開發接口。
3.背誦:
4.思考:
  1. 網絡編程的難度到底在哪裏,這裏一直是我薄弱網絡編程水平所沒法真正理解的地方。做爲一個java程序員,瞭解過c,api不難用,netty也關注過,彷佛打造一個穩定的網絡服務是一件很是麻煩的事情,做爲程序員,其實在本質上很難理解對錯以外的事情。這個彷佛能夠說得上是缺陷。能力上的缺陷。
5.複習:
  1. 總結
  1. 數據庫調優裏面有這麼句話,80%的數據庫問題,與數據庫自己無關,這些無關問題裏面,又以網絡問題爲重中之重,Oracle的監聽配置也是很是容易出現問題。
  2. 在分佈式數據庫時代,成本的開銷主要集中在網絡IO之上,因此說,網絡對於數據庫的重要性不言而喻。
  3. 咱們這裏網路暫時須要的是創建一個客戶端與服務端的通信
相關文章
相關標籤/搜索