├── .gitattributes ├── .gitignore ├── README.md ├── TCP IP 详解 └── README.md ├── UNP ├── 01 简介 │ ├── README.md │ ├── progs │ │ ├── DaytimeServer.c │ │ ├── GetServerDaytimeClient.c │ │ ├── GetServerDaytimeClient_IPv6.c │ │ ├── Practise_03.c │ │ ├── Practise_04.c │ │ ├── Practise_05_00.c │ │ ├── Practise_05_01.c │ │ └── tcp_time_server.c │ └── 习题.md ├── 02 传输层 TCP UDP 和 SCTP │ ├── README.md │ ├── images │ │ ├── TCP_segment_exchange.png │ │ ├── TCP_state_change.png │ │ └── p4.png │ ├── progs │ │ ├── AcceptDeadLockClient.c │ │ ├── AcceptDeadLockServer.c │ │ ├── ConnectAtTheSameTime.c │ │ ├── SendBigDataByTCP.c │ │ ├── SendBigDataByUDP.c │ │ └── run.sh │ └── 习题.md ├── 03 套接字编程简介 │ ├── README.md │ ├── progs │ │ ├── AddressTransformFunctionUseBigEndianByDefault.c │ │ ├── BigEndianOrLittleEndian.c │ │ ├── BugOfAddressTransform.c │ │ ├── ImplementationOfAddressTransformFunction.c │ │ ├── Practise_03.c │ │ ├── QuickReadLine.c │ │ ├── ReadNBytes.c │ │ ├── VerySlowReadLine.c │ │ └── WriteNBytes.c │ └── 习题.md ├── 04 基本 TCP 套接字编程 │ ├── README.md │ ├── images │ │ ├── tcp_shakehands_queue.png │ │ └── tcp_shakehands_queue_2.png │ ├── progs │ │ ├── ConcurrentMultiProcessesDaytimeServer.c │ │ ├── ConcurrentMultiProcessesDaytimeServerHandleByNewProgram.c │ │ ├── DaytimeServerDisplayClientAddress.c │ │ ├── GetServerDaytimeClient.c │ │ ├── GetServerDaytimeClientDisplayAddress.c │ │ ├── Practise_02.c │ │ ├── Practise_04.c │ │ ├── Practise_05.c │ │ ├── RunByExecFunctionServer.c │ │ └── WhatHappenToConnectedfdIfListenfdClosed.c │ └── 习题.md ├── 05 TCP 客户 服务器程序示例 │ ├── README.md │ ├── progs │ │ ├── ConcurrentMultiProcessEchoServer.c │ │ ├── ConcurrentMultiProcessEchoServerHandleZombieBug.c │ │ ├── ConcurrentMultiProcessEchoServerHandleZombieCorrect.c │ │ ├── EchoClient.c │ │ ├── IfConnectRetureBeforeAcceptClient.c │ │ ├── IfConnectRetureBeforeAcceptServer.c │ │ ├── ServerProcessTerminated.c │ │ ├── WaitAndWaitpidTestClient.c │ │ ├── data │ │ └── fgetsAndfputs.c │ └── 习题.md ├── 06 IO复用 selet 和 poll 函数 │ ├── progs │ │ ├── PollEchoServer.c │ │ ├── Practise_01.c │ │ ├── Practise_04.c │ │ ├── Practise_08.c │ │ ├── SelectEchoClient.c │ │ ├── SelectEchoClientHalfClose.c │ │ ├── SelectEchoServer.c │ │ ├── file │ │ └── output │ └── 习题.md ├── 07 套接字选项 │ ├── README.md │ ├── images │ │ ├── 7.08.png │ │ ├── 7.09.png │ │ └── 7.10.png │ ├── progs │ │ ├── CloseTestClientLinger0.c │ │ ├── CloseTestClientLinger30.c │ │ ├── CloseTestClientNormal.c │ │ ├── CloseTestServer.c │ │ ├── DiscardServer.c │ │ ├── NagleTest.c │ │ ├── NotUseOptionSO_REUSEADDR.c │ │ ├── Practise_01.c │ │ ├── Practise_02.c │ │ ├── Practise_03_client.c │ │ ├── Practise_03_server.c │ │ ├── Practise_04.c │ │ ├── Practise_04_nowait.c │ │ ├── Practise_04_wait.c │ │ ├── SelectEchoClient_WaterMarker.c │ │ ├── TCPDisplayDefaultValue.c │ │ ├── TCPKeepAliveClient.c │ │ ├── TCPKeepAliveServer.c │ │ ├── TCP_NODELAYClient.c │ │ ├── UDPDisplayDefaultValue.c │ │ └── UseOptionSO_REUSEADDR_BindDifferentIp.c │ └── 习题.md ├── 08 基本 UDP 套接字编程 │ ├── README.md │ ├── progs │ │ ├── SendBigDataByUDP.c │ │ ├── UDPEchoClient.c │ │ ├── UDPEchoClient_CheckServerIP.c │ │ ├── UDPEchoConnectedClient.c │ │ ├── UDPEchoConnectedClient_EISCONN.c │ │ ├── UDPEchoDisconnectedClient_EDSTADDRREQ.c │ │ ├── UDPEchoServer.c │ │ ├── UDPGetSourceAddrByConnectAndGetSockName.c │ │ ├── UDPLackFlowControlClient_DelaySend.c │ │ ├── UDPLackFlowControlServer.c │ │ ├── UDPLackFlowControlServer_BiggerBufferSpace.c │ │ └── UDPTCPSelectEchoServer.c │ └── 习题.md ├── 11 名字与地址转换 │ ├── progs │ │ ├── GetHostByAddr.c │ │ ├── GetHostByName.c │ │ ├── GetServByName.c │ │ ├── GetServByPort.c │ │ ├── Practise_01.c │ │ ├── Practise_02_client.c │ │ ├── Practise_02_server.c │ │ ├── TCPDaytimeClientUseGetAddrInfo.c │ │ ├── TCPDaytimeServerUseGetAddrInfo.c │ │ ├── TCPEchoClientUseGetAddrInfo.c │ │ ├── UDPDaytimeClientUseGetAddrInfo.c │ │ ├── UDPDaytimeClientUseGetAddrInfo_Connected.c │ │ └── UDPDaytimeServerUseGetAddrInfo.c │ └── 习题.md ├── 13 守护进程和 inetd 超级服务器 │ ├── README.md │ ├── progs │ │ ├── CreateDaemonProcess.c │ │ ├── TCPDaytimeClientUseGetAddrInfo.c │ │ ├── TCPDaytimeServerExecByXinetd.c │ │ ├── TCPUDPDaytimeServerWithDaemonProcess.c │ │ ├── UDPDaytimeClientUseGetAddrInfo.c │ │ └── UDPDaytimeServerExecByXinetd.c │ └── 习题.md ├── 14 高级 IO 函数 │ ├── README.md │ ├── progs │ │ ├── Practise_02_client.c │ │ ├── Practise_03_client.c │ │ ├── Practise_05_server.c │ │ ├── StrcpyAndSnprintfTest.c │ │ ├── TCPEchoClientUseGetAddrInfo.c │ │ ├── TCPEchoServer_StandardIO.c │ │ ├── TCPReadvTestClient_EveryLoopOneByte_TCP_NODELAY.c │ │ ├── TCPReadvTestClient_WriteAllOneTime.c │ │ ├── TCPReadvTestServer.c │ │ ├── TCPRecvFlagTestServer_MSG_PEEK.c │ │ ├── TCPRecvFlagTestServer_MSG_WAITALL.c │ │ ├── TCPRecvTestClient_EveryLoopOneByte_TCP_NODELAY_Delay.c │ │ ├── TCPWritevTestClient.c │ │ ├── TCPWritevTestServer.c │ │ ├── TimeoutConnectClientBySignal.c │ │ ├── TimeoutRecvfromClientBySelect.c │ │ ├── TimeoutRecvfromClientBySignal_UDPDaytimeClient.c │ │ ├── TimeoutRecvfromClientBySockOpt.c │ │ ├── UDPClientUseSendmsg.c │ │ ├── UDPDaytimeServer_Delay.c │ │ ├── UDPServerUseRecvmsg.c │ │ ├── client_TCP_EveryLoopOneByte_TCP_NODELAY_Delay.c │ │ ├── client_UDP_EveryLoopOneByte_Delay.c │ │ ├── server_TCP_LookHowManyInRecvBufferButNotRead_MSG_PEEK.c │ │ ├── server_TCP_LookHowManyInRecvBufferButNotRead_ioctl.c │ │ ├── server_UDP_LookHowManyInRecvBufferButNotRead_MSG_PEEK.c │ │ └── server_UDP_LookHowManyInRecvBufferButNotRead_ioctl.c │ └── 习题.md ├── 15 Unix 域协议 │ ├── README.md │ ├── progs │ │ ├── BindPathForUnixFd.c │ │ ├── FdTransfer_Read_End.c │ │ ├── FdTransfer_Write_End.c │ │ ├── GetRatioOfConnectionsByBacklog.c │ │ ├── Practise_03_client.c │ │ ├── Practise_03_server.c │ │ ├── SocketPairTest.c │ │ ├── TCPEchoClient_UnixFd.c │ │ ├── TCPEchoServer_UnixFd.c │ │ ├── UDPEchoClient_UnixFd.c │ │ ├── UDPEchoServer_UnixFd.c │ │ ├── unixFd_Practise_03_client.c │ │ └── unixFd_Practise_03_server.c │ └── 习题.md ├── 16 非阻塞式 IO │ ├── README.md │ ├── images │ │ ├── img_1.jpg │ │ ├── img_2.jpg │ │ ├── img_3.jpg │ │ ├── img_4.jpg │ │ ├── img_5.jpg │ │ └── img_6.jpg │ ├── progs │ │ ├── BlockAcceptBug_TCPClient.c │ │ ├── BlockAcceptBug_TCPServer.c │ │ ├── MultiNonblockConnectForTcpdump.c │ │ ├── NonblockConnect.c │ │ ├── NonblockTCPEchoClient.c │ │ ├── TCPEchoClientByFork.c │ │ ├── WebClientMultiConnectDownload_Block.c │ │ ├── WebClientMultiConnectDownload_Nonblock.c │ │ ├── WebServer.c │ │ ├── WriteFile.c │ │ ├── analyze │ │ ├── output │ │ ├── run_block.sh │ │ ├── run_nonblock.sh │ │ ├── tcpdump_output │ │ └── timeline │ └── 习题.md ├── 17 ioctl 操作 │ ├── README.md │ ├── progs │ │ ├── ARPOperation.c │ │ ├── AssignMemoryForIfconfTooLess.c │ │ ├── InterfaceTool.c │ │ ├── InterfaceTool.h │ │ ├── TestInterface.c │ │ ├── WriteNClient.c │ │ └── WriteNServer.c │ └── 习题.md ├── 18 路由套接字 │ ├── README.md │ ├── progs │ │ ├── CheckIfUDPChecksumEnable.c │ │ ├── GetARPTable_BySysctl.c │ │ ├── GetInterfaceIndexByName.c │ │ ├── GetInterfaceNameByIndex.c │ │ ├── GetRouteTableEntry_BySockfd.c │ │ ├── GetRouteTable_BySysctl.c │ │ ├── InterfaceTool_v2.c │ │ ├── InterfaceTool_v2.h │ │ ├── Practise_02.c │ │ ├── RoundUpTest.c │ │ └── TestInterface.c │ └── 习题.md ├── 22 高级 UDP 套接字编程 │ ├── README.md │ ├── progs │ │ ├── ConccurentUDPEchoClient.c │ │ ├── ConccurentUDPEchoServer.c │ │ ├── CreateData.c │ │ ├── GetUDPIP_client.c │ │ ├── GetUDPIP_server.c │ │ ├── UDPEchoClient_Reliable.c │ │ ├── UDPEchoClient_Reliable_select.c │ │ ├── UDPEchoClient_TimeoutRecv_TestPacketLoss.c │ │ ├── reliable_udp.c │ │ ├── reliable_udp.h │ │ ├── reliable_udp_review.c │ │ └── reliable_udp_review.h │ └── 习题.md ├── 24 带外数据 │ ├── README.md │ ├── progs │ │ ├── FlowControlTestClient.c │ │ ├── FlowControlTestServer.c │ │ ├── OOBMarkCover_client.c │ │ ├── Practise_02_server.c │ │ ├── SelectEchoClient_heartbeat.c │ │ ├── SelectEchoServer_heartbeat.c │ │ ├── SendOutOfBandData_TCPClient.c │ │ ├── SendOutOfBandData_TCPSelectServer.c │ │ ├── SendOutOfBandData_TCPSelectServer_book.c │ │ ├── SendOutOfBandData_TCPServer.c │ │ ├── StopAtOOBMarkTest_client.c │ │ ├── StopAtOOBMarkTest_server.c │ │ ├── client_heartbeat_helper.c │ │ ├── client_heartbeat_helper.h │ │ ├── server_heartbeat_helper.c │ │ └── server_heartbeat_helper.h │ └── 习题.md ├── 25 信号驱动式 IO │ ├── README.md │ ├── progs │ │ ├── UDPEchoServer_BySIGIO.c │ │ ├── udp_echo_driven_by_sigio.c │ │ └── udp_echo_driven_by_sigio.h │ └── 习题.md ├── 26 线程 │ ├── README.md │ ├── progs │ │ ├── CreateData.c │ │ ├── IncorrectOfMultiThreadIncreaseStaticVar.c │ │ ├── MultiThreadTCPEchoClient.c │ │ ├── MultiThreadTCPEchoServer.c │ │ ├── MultiThreadWebClient.c │ │ ├── MultiThreadWebClient_ByCondition.c │ │ ├── NonblockWebClient.c │ │ ├── PthreadJoinTest.c │ │ ├── ReadWriteTool_safe.c │ │ └── ReadWriteTool_safe.h │ └── 习题.md ├── 28 原始套接字 │ ├── README.md │ ├── progs │ │ ├── FdTransmitTool.c │ │ ├── FdTransmitTool.h │ │ ├── LookHowManyBytesOfStructICMP.c │ │ ├── OpenServer.c │ │ ├── ReadClient.c │ │ ├── SignBitExpendTest.c │ │ ├── UDPEchoClient.c │ │ ├── comm.h │ │ ├── icmp_daemon.c │ │ ├── ping.c │ │ ├── traceroute.c │ │ └── traceroute_book.c │ └── 习题.md ├── 29 数据链路访问 │ ├── README.md │ └── 习题.md ├── 30 客户服务器程序设计范式 │ ├── README.md │ ├── progs │ │ ├── AddrTool.c │ │ ├── AddrTool.h │ │ ├── CPUTimeTest.c │ │ ├── FdTransmitTool.c │ │ ├── FdTransmitTool.h │ │ ├── FileLockTest.c │ │ ├── TCPClient_ForBenchmark.c │ │ ├── TCPServer_FdTransmitForkPool.c │ │ ├── TCPServer_FileLockForkPool.c │ │ ├── TCPServer_Fork.c │ │ ├── TCPServer_ForkPool.c │ │ ├── TCPServer_MainThreadAccept_ThreadPool.c │ │ ├── TCPServer_MainThreadAccept_ThreadPool_BUG.c │ │ ├── TCPServer_PthreadLockForkPool.c │ │ ├── TCPServer_ThreadPool.c │ │ └── config.h │ └── 习题.md ├── 99 epoll 补充 │ ├── README.md │ ├── progs │ │ └── EpollEchoServer.c │ └── 习题.md ├── review │ ├── ICMPDaemon.c │ ├── ICMPPing.c │ ├── ReadableOccurButBlockedWhileReading.c │ ├── TCPEchoClient_Epoll.c │ ├── TCPEchoClient_MultiProcess.c │ ├── TCPEchoClient_MultiThread.c │ ├── TCPEchoClient_NonBlock.c │ ├── TCPEchoClient_Normal.c │ ├── TCPEchoClient_Poll.c │ ├── TCPEchoClient_Select.c │ ├── TCPEchoServer_Normal.c │ ├── TCPPerformanceTestClient.c │ ├── TCPUDPEchoServer_Epoll.c │ ├── TCPUDPEchoServer_MultiThread.c │ ├── TCPUDPEchoServer_Poll.c │ ├── TCPUDPEchoServer_Select.c │ ├── UDPEchoClient.c │ ├── UDPEchoClient_ICMPDaemon.c │ ├── create_file │ ├── data │ ├── icmp_daemon │ ├── output │ ├── test.c │ ├── udp_client_test.c │ └── udp_server_test.c └── tool │ ├── AddrTool.c │ ├── AddrTool.h │ ├── CommonTool.c │ ├── CommonTool.h │ ├── FdTransmitTool.c │ ├── FdTransmitTool.h │ ├── PathTool.c │ ├── PathTool.h │ ├── ReadWriteTool.c │ ├── ReadWriteTool.h │ ├── ReadWriteTool_safe.c │ ├── ReadWriteTool_safe.h │ ├── TimeTool.c │ ├── TimeTool.h │ ├── bin_tool.c │ ├── bin_tool.h │ ├── config.h │ └── test.c └── 计算机网络自顶向下 ├── 01 计算机网络和因特网 ├── 01 计算机网络和因特网.xmind ├── Wireshake_lab-Intro.md ├── images │ ├── mistake.png │ ├── p10.png │ ├── p14.png │ ├── p17.1.png │ ├── p17.2.png │ ├── p4.1.png │ ├── p4.2.png │ ├── p4.3.png │ ├── r16.png │ ├── r4.1.png │ ├── r4.2.png │ ├── r4.3.png │ ├── r4.4.png │ ├── r4.5.png │ ├── r4.6.png │ ├── wireshake_dns.png │ ├── wireshake_http.png │ ├── wireshake_icmp.png │ ├── wireshake_tcp.png │ └── wireshake_time.png ├── 习题.md └── 复习题.md ├── 02 应用层 ├── 02 应用层.xmind ├── Wireshake_lab-DNS.md ├── Wireshake_lab-HTTP.md ├── images │ ├── p18.png │ ├── p19.1.png │ ├── p19.2.png │ ├── p19.3.png │ ├── p19.4.png │ ├── p19.5.png │ ├── p22.png │ ├── p24.1.png │ ├── p24.2.png │ ├── p27.png │ ├── p7.png │ ├── p9.1.png │ ├── wl1.png │ ├── wl10.png │ ├── wl11.png │ ├── wl12.png │ ├── wl13.png │ ├── wl14.png │ ├── wl15.png │ ├── wl16.png │ ├── wl17.png │ ├── wl18.png │ ├── wl2.png │ ├── wl3.png │ ├── wl4.png │ ├── wl5.png │ ├── wl6.png │ ├── wl7.png │ ├── wl8.png │ ├── wl9.png │ ├── wldns1.png │ ├── wldns10.png │ ├── wldns11.png │ ├── wldns12.png │ ├── wldns13.1.png │ ├── wldns13.png │ ├── wldns14.png │ ├── wldns15.png │ ├── wldns16.png │ ├── wldns17.png │ ├── wldns18.png │ ├── wldns19.png │ ├── wldns2.png │ ├── wldns20.png │ ├── wldns21.png │ ├── wldns3.png │ ├── wldns4.png │ ├── wldns5.1.png │ ├── wldns5.png │ ├── wldns6.png │ ├── wldns7.png │ ├── wldns8.png │ └── wldns9.png ├── progs │ ├── SMTPClient.c │ ├── TCPClient.c │ ├── TCPClientSendFile.c │ ├── TCPServer.c │ ├── UDPClient.c │ ├── UDPPingerClient.c │ ├── UDPPingerServer.c │ ├── UDPServer.c │ ├── WebClient.c │ ├── WebServer.c │ ├── WebServerProxy.c │ ├── iPhoneTCPClient │ │ ├── iPhoneTCPClient.xcodeproj │ │ │ ├── project.pbxproj │ │ │ ├── project.xcworkspace │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ ├── xcshareddata │ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ │ └── xcuserdata │ │ │ │ │ └── YangHan.xcuserdatad │ │ │ │ │ └── UserInterfaceState.xcuserstate │ │ │ └── xcuserdata │ │ │ │ └── YangHan.xcuserdatad │ │ │ │ ├── xcdebugger │ │ │ │ └── Breakpoints_v2.xcbkptlist │ │ │ │ └── xcschemes │ │ │ │ └── xcschememanagement.plist │ │ ├── iPhoneTCPClient │ │ │ ├── AppDelegate.h │ │ │ ├── AppDelegate.m │ │ │ ├── Assets.xcassets │ │ │ │ ├── AppIcon.appiconset │ │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ │ ├── Base.lproj │ │ │ │ ├── LaunchScreen.storyboard │ │ │ │ └── Main.storyboard │ │ │ ├── Info.plist │ │ │ ├── ViewController.h │ │ │ ├── ViewController.m │ │ │ └── main.m │ │ ├── iPhoneTCPClientTests │ │ │ ├── Info.plist │ │ │ └── iPhoneTCPClientTests.m │ │ └── iPhoneTCPClientUITests │ │ │ ├── Info.plist │ │ │ └── iPhoneTCPClientUITests.m │ └── rm_exec.sh ├── resource │ └── index.html ├── 习题.md └── 复习题.md ├── 03 运输层 ├── README.md ├── Wireshake_lab-TCP.md ├── Wireshake_lab-UDP.md ├── images │ ├── AIMD_graph.png │ ├── GBN.png │ ├── Interesting_case.png │ ├── Stop_And_Wait_prog_design.png │ ├── TCP_congestion_control_alg.png │ ├── TCP_fairness.png │ ├── TCP_four_handshake.png │ ├── TCP_segment.png │ ├── TCP_three_handshake.png │ ├── Telnet.png │ ├── UDP_segment.png │ ├── nEstimatedRTT.png │ ├── p10.1.png │ ├── p10.2.png │ ├── p13.png │ ├── p17.png │ ├── p18.1.png │ ├── p18.2.png │ ├── p18.3.png │ ├── p19.png │ ├── p20.png │ ├── p21.png │ ├── p22.1.png │ ├── p22.2.png │ ├── p22.png │ ├── p23.png │ ├── p27.png │ ├── p3.1.png │ ├── p32.png │ ├── p33.png │ ├── p36.png │ ├── p4.1.png │ ├── p4.2.png │ ├── p40.png │ ├── p41.png │ ├── p45.a.jpg │ ├── p45.b.jpg │ ├── p49.1.png │ ├── p49.2.png │ ├── p49.3.png │ ├── p49.4.png │ ├── p50.png │ ├── p51.png │ ├── p56.1.png │ ├── p56.2.png │ ├── p56.3.png │ ├── p6.png │ ├── p8.png │ ├── p9.png │ ├── question.1.png │ ├── r10.1.png │ ├── r13.1.png │ ├── r13.2.png │ ├── r13.3.png │ ├── r16.png │ ├── r17.png │ ├── r19.png │ ├── r9.1.png │ ├── r9.2.png │ ├── rdt_1_0.png │ ├── rdt_2_0.png │ ├── rdt_2_1.png │ ├── rdt_2_2.png │ ├── rdt_3_0.png │ ├── sr_dilemma.png │ ├── stop_wait_vs_pipeline.png │ ├── tcp_sendbuf_recvbuf.png │ ├── wl_tcp.1.png │ ├── wl_tcp.10.png │ ├── wl_tcp.11.png │ ├── wl_tcp.12.png │ ├── wl_tcp.13.png │ ├── wl_tcp.14.png │ ├── wl_tcp.15.png │ ├── wl_tcp.2.png │ ├── wl_tcp.3.png │ ├── wl_tcp.4.png │ ├── wl_tcp.5.png │ ├── wl_tcp.6.png │ ├── wl_tcp.7.png │ ├── wl_tcp.8.png │ ├── wl_tcp.9.png │ ├── wl_udp.1.png │ ├── wl_udp.10.png │ ├── wl_udp.2.png │ ├── wl_udp.3.png │ ├── wl_udp.4.png │ ├── wl_udp.5.png │ ├── wl_udp.6.png │ ├── wl_udp.7.png │ ├── wl_udp.8.png │ └── wl_udp.9.png ├── progs │ ├── GBN │ │ ├── README.md │ │ ├── TCP.c │ │ ├── TCP.h │ │ ├── comm.h │ │ ├── log.c │ │ ├── log.h │ │ ├── receiver │ │ ├── receiver.c │ │ ├── run_receiver.sh │ │ ├── run_sender.sh │ │ ├── sender │ │ ├── sender.c │ │ ├── tool.c │ │ └── tool.h │ ├── Stop_And_Wait │ │ ├── README.md │ │ ├── TCP.c │ │ ├── TCP.h │ │ ├── comm.h │ │ ├── log.c │ │ ├── log.h │ │ ├── receiver │ │ ├── receiver.c │ │ ├── run_receiver.sh │ │ ├── run_sender.sh │ │ ├── sender │ │ ├── sender.c │ │ ├── test.c │ │ ├── tool.c │ │ └── tool.h │ └── checksum.c ├── resource │ └── TCP_lab.txt ├── 习题_01_02.md ├── 习题_03_05.md ├── 习题_06_16.md ├── 习题_17_21.md ├── 习题_22_24.md ├── 习题_25_28.md ├── 习题_29&55.md ├── 习题_30_33.md ├── 习题_34_56.md ├── 复习题_31_33.md ├── 复习题_34.md ├── 复习题_35.md └── 复习题_37.md ├── 04 网络层 ├── README.md ├── Wireshake_lab-DHCP.md ├── Wireshake_lab-ICMP.md ├── Wireshake_lab-IP.md ├── Wireshake_lab-NAT.md ├── images │ ├── AS.png │ ├── AS_BGP.png │ ├── BGP_NEXT_HOP │ ├── BGP_check_loop.png │ ├── BGP_routing_strategy.png │ ├── DHCP_exchange_for_switching_wifi.png │ ├── DHCP_interaction.png │ ├── DV_algorithms.png │ ├── DV_algorithms_linkcost_decrease.png │ ├── DV_algorithms_linkcost_decrease_2.png │ ├── DV_algorithms_linkcost_increase.png │ ├── FIFO_scheduling.png │ ├── HOL.png │ ├── IPv4报文格式.png │ ├── IPv6_segment.png │ ├── Oscillations.png │ ├── RIP_working.png │ ├── Router_structure.png │ ├── Switching_3_structure.png │ ├── VC_number.png │ ├── configure_AS_internal_forward_table.png │ ├── loop_weighted_scheduling.png │ ├── network_layer_outline.png │ ├── p24.png │ ├── p26.1.png │ ├── p26.png │ ├── p28.1.png │ ├── p28.png │ ├── p30.png │ ├── p31.1.png │ ├── p31.png │ ├── p34.1.png │ ├── p34.2.png │ ├── p34.png │ ├── p37.png │ ├── p39.png │ ├── p4.png │ ├── p40.1.png │ ├── p40.2.png │ ├── p40.3.png │ ├── p43.png │ ├── p44.png │ ├── p45.1.png │ ├── p45.png │ ├── p46.png │ ├── p47.png │ ├── p48.1.png │ ├── p48.png │ ├── p49.1.png │ ├── p49.2.png │ ├── p49.png │ ├── p5.png │ ├── p50.1.png │ ├── p50.png │ ├── p51.png │ ├── p52.png │ ├── p9.png │ ├── priority_scheduling.png │ ├── r15.png │ ├── wl_dhcp_0.png │ ├── wl_dhcp_000.png │ ├── wl_dhcp_1.png │ ├── wl_dhcp_10.png │ ├── wl_dhcp_11.png │ ├── wl_dhcp_12.png │ ├── wl_dhcp_2.png │ ├── wl_dhcp_3.png │ ├── wl_dhcp_4.png │ ├── wl_dhcp_5.png │ ├── wl_dhcp_6.png │ ├── wl_dhcp_7.png │ ├── wl_dhcp_8.png │ ├── wl_dhcp_9.png │ ├── wl_icmp_1.png │ ├── wl_icmp_2.png │ ├── wl_icmp_3.png │ ├── wl_icmp_4.png │ ├── wl_icmp_5.png │ ├── wl_ip_1.png │ ├── wl_ip_2.png │ ├── wl_ip_3.png │ ├── wl_ip_4.png │ ├── wl_ip_5.png │ ├── wl_ip_6.png │ ├── wl_ip_7.png │ ├── wl_nat_figure_1.png │ └── 分片和组装.png ├── progs │ ├── Algorithms │ │ ├── Array.c │ │ ├── Array.h │ │ ├── BreadthFirstPath.c │ │ ├── BreadthFirstPath.h │ │ ├── Dijkstra.c │ │ ├── Dijkstra.h │ │ ├── DijkstraX.c │ │ ├── DijkstraX.h │ │ ├── Graph.c │ │ ├── Graph.h │ │ ├── PrimMST.c │ │ ├── PrimMST.h │ │ ├── PriorityQueue.c │ │ ├── PriorityQueue.h │ │ ├── Stack.c │ │ ├── Stack.h │ │ ├── log.c │ │ ├── log.h │ │ ├── main.c │ │ ├── run.sh │ │ ├── test │ │ ├── tool.c │ │ └── tool.h │ ├── p26.c │ ├── p44.c │ ├── p49.c │ ├── p50.c │ └── run.sh ├── 习题_01_06.md ├── 习题_07_09.md ├── 习题_10_18.md ├── 习题_19_20.md ├── 习题_21_23.md ├── 习题_24_27.md ├── 习题_28_34.md ├── 习题_35_43.md ├── 习题_44_55.md ├── 复习题_41_42.md ├── 复习题_43_44.md └── 复习题_45_47.md ├── 05 链路层 ├── README.md ├── Wireshake_lab-Ethernet_ARP.md ├── images │ ├── 5_1_5.png │ ├── DOCSIS.png │ ├── checksum_wrong_analyze.png │ ├── ethernet_frame_structure.png │ ├── link_layer_imp_position.png │ ├── p12.1.png │ ├── p12.2.png │ ├── p12.3.png │ ├── p14.1.png │ ├── p14.2.png │ ├── p14.png │ ├── p18.png │ ├── p2.png │ ├── p20.1.png │ ├── p20.png │ ├── p22.png │ ├── p23.png │ ├── p26.png │ ├── p28.png │ ├── p29.png │ ├── p32.1.png │ ├── p32.2.png │ ├── p32.png │ ├── p33.1.png │ ├── p33.png │ ├── p5.png │ ├── p8.1.png │ ├── p8.2.png │ ├── p9.png │ ├── r12.png │ ├── r2.png │ ├── wl_arp_1.png │ └── wl_arp_2.png ├── progs │ ├── bin_tool.c │ ├── bin_tool.h │ ├── checksum.c │ ├── checksum.h │ ├── p4 │ ├── p4.c │ ├── test │ └── test.c ├── 习题_01_07.md ├── 习题_08_13.md ├── 习题_14_16.md ├── 习题_17_20.md ├── 习题_23_25.md ├── 习题_27.md ├── 习题_28_30.md ├── 习题_31.md ├── 习题_32_33.md ├── 复习题_51_52.md ├── 复习题_53.md └── 复习题_54.md └── 08 计算机网络中的安全 ├── README.md ├── Wireshake_lab-SSL.md ├── image ├── IPsec_packet_structure.png ├── application_gateway_filter.png ├── p10.png ├── p11.png ├── p12.png ├── p15.png ├── p16.1.png ├── p16.2.png ├── p19.png ├── p26.png ├── p4.1.png ├── p4.2.png ├── p4.3.png ├── p9.png ├── stateful_packet_filter.png ├── traditional_packet_filter.png ├── wl_ssl_1.png ├── wl_ssl_2.png ├── wl_ssl_3.png ├── wl_ssl_4.png ├── wl_ssl_5.png ├── wl_ssl_6.png ├── wl_ssl_7.png ├── wl_ssl_8.png └── wl_ssl_9.png ├── 习题_01_06.md ├── 习题_07_08.md ├── 习题_09.md ├── 习题_10.md ├── 习题_11_12.md ├── 习题_13.md ├── 习题_14.md ├── 习题_15_16.md ├── 习题_17_18.md ├── 习题_19_21.md ├── 习题_22_23.md ├── 习题_24.md ├── 习题_25.md ├── 习题_26.md ├── 复习题_81.md ├── 复习题_82.md ├── 复习题_83_84.md ├── 复习题_85_88.md └── 复习题_89.md /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /TCP IP 详解/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/TCP IP 详解/README.md -------------------------------------------------------------------------------- /UNP/01 简介/README.md: -------------------------------------------------------------------------------- 1 | * iptables 使用 2 | * rinet 端口转发 3 | * netstat 使用 -------------------------------------------------------------------------------- /UNP/02 传输层 TCP UDP 和 SCTP/images/TCP_segment_exchange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/02 传输层 TCP UDP 和 SCTP/images/TCP_segment_exchange.png -------------------------------------------------------------------------------- /UNP/02 传输层 TCP UDP 和 SCTP/images/TCP_state_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/02 传输层 TCP UDP 和 SCTP/images/TCP_state_change.png -------------------------------------------------------------------------------- /UNP/02 传输层 TCP UDP 和 SCTP/images/p4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/02 传输层 TCP UDP 和 SCTP/images/p4.png -------------------------------------------------------------------------------- /UNP/02 传输层 TCP UDP 和 SCTP/progs/AcceptDeadLockClient.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "../../tool/CommonTool.h" 9 | 10 | int cb(int fd) 11 | { 12 | struct linger l; 13 | l.l_onoff = 1; 14 | l.l_linger = 0; 15 | if ((setsockopt(fd, SOL_SOCKET, SO_LINGER, &l, sizeof(l))) < 0) { 16 | perror("setsockopt error!"); 17 | return -1; 18 | } 19 | return 0; 20 | } 21 | 22 | int main(int argc, char *argv[]) 23 | { 24 | if (argc != 3) { 25 | printf("usage : %s \n", argv[0]); 26 | exit(1); 27 | } 28 | int fd = -1; 29 | if ((fd = tcp_connect_cb(argv[1], argv[2], cb)) < 0) { 30 | perror("tcp_connect_cb error!"); 31 | exit(1); 32 | } 33 | printf("connect to %s %s succ!\n", argv[1], argv[2]); 34 | close(fd); 35 | } 36 | -------------------------------------------------------------------------------- /UNP/02 传输层 TCP UDP 和 SCTP/progs/AcceptDeadLockServer.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "../../tool/AddrTool.h" 9 | #include "../../tool/CommonTool.h" 10 | 11 | int main(int argc, char *argv[]) 12 | { 13 | if (argc != 2) { 14 | printf("usage : %s \n", argv[0]); 15 | exit(1); 16 | } 17 | int fd = -1; 18 | if ((fd = tcp_server_cb(argv[1], NULL)) < 0) { 19 | perror("tcp_server_cb error!"); 20 | exit(1); 21 | } 22 | 23 | int connfd; 24 | char buf[1024]; 25 | for (;;) { 26 | sleep(5); 27 | printf("wake up, and begin to accept\n"); 28 | if ((connfd = accept(fd, NULL, NULL)) < 0) { 29 | if (errno != EINTR) 30 | perror("accept error!"); 31 | continue; 32 | } 33 | printf("accept succ\n"); 34 | char *srcInfo = getPeerInfo(fd); 35 | printf("tcp connection from %s\n", srcInfo); 36 | free(srcInfo); 37 | 38 | close(connfd); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /UNP/02 传输层 TCP UDP 和 SCTP/progs/run.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | cc ConnectAtTheSameTime.c 4 | 5 | killall a.out 6 | 7 | ./a.out 127.0.0.1 50001 53000 & 8 | ./a.out 127.0.0.1 53000 50001 & 9 | sleep 1 10 | netstat -an | grep -e 50001 -e 53000 11 | -------------------------------------------------------------------------------- /UNP/02 传输层 TCP UDP 和 SCTP/习题.md: -------------------------------------------------------------------------------- 1 | #### 1、我们已经提到 IPv4 和 IPv6。IP 版本 5 情况如何,IP 版本 0、1、2 和 3 又是什么? 2 | #### 2、你从哪里可以找到有关 IP 版本 5 的信息? 3 | 4 | #### 3、在讲解图 2-15 时我们说过,如果没收到来自对端的 MSS 选项,本端 TCP 就采用 536 这个 MSS 值,为什么使用这个值? 5 | * IPv4 的最小重组缓冲区大小是 576 字节,如果没有收到对端的 MSS 通告,那么就使用 IPv4 最小重组缓冲区大小 576 字节,那么也就是说 MSS 使用 576 - 40 = 536 字节。 6 | 7 | #### 4、给在第 1 章中讲解的时间获取客户/服务器应用画出类似于图 2-5 的分组交换过程,假设服务器在单个 TCP 分组中返回 26 个字节的完整数据。 8 | * ![](https://github.com/YangXiaoHei/Networking/blob/master/UNP/02%20传输层%20TCP%20UDP%20和%20SCTP/images/p4.png) 9 | 10 | #### 5、在一个以太网上的主机和一个令牌环网上的主机之间建立一个连接,其中以太网上主机的 TCP 通告的 MSS 为 1460,令牌环网上主机的 TCP 通告的 MSS 为 4096。两个主机都没有实现路径 MTU 发现功能。观察分组,我们在两个相反方向上都找不到大于 1460 自己的数据,为什么? 11 | * 令牌环网上的主机最多可以发送 1460 的 MSS,这是由以太网主机通告的。而以太网主机最多可发送 4096 的 MSS,但是为了避免分片,它不会发送大于以太网接口的 MSS。 12 | 13 | #### 6、在讲解图 2-19 时我们说过 OSPF 直接使用 IP。承载 OSPF 数据报的 IPv4 首部的协议字段是什么值? 14 | * 89 15 | 16 | 17 | -------------------------------------------------------------------------------- /UNP/03 套接字编程简介/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/03 套接字编程简介/README.md -------------------------------------------------------------------------------- /UNP/03 套接字编程简介/progs/AddressTransformFunctionUseBigEndianByDefault.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "../../tool/bin_tool.h" 8 | 9 | int main(int argc, char const *argv[]) 10 | { 11 | const char *ip = "119.29.207.157"; 12 | 13 | /* 14 | * inet_aton 这些函数默认了 in_addr 中存储的是按照大端序列存放的字节 15 | */ 16 | struct in_addr addr; 17 | inet_aton(ip, &addr); 18 | 19 | printf("%s\n", u32ToBinaryString(addr.s_addr, EN_GROUP_IN_EIGHTS)); 20 | 21 | char tmp[16]; 22 | unsigned char *p = (unsigned char *)&addr; 23 | snprintf(tmp, sizeof(tmp), "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); 24 | printf("%s\n", tmp); 25 | 26 | 27 | return 0; 28 | } -------------------------------------------------------------------------------- /UNP/03 套接字编程简介/progs/BigEndianOrLittleEndian.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int argc, char const *argv[]) 4 | { 5 | union { 6 | short s; 7 | char c[sizeof(short)]; 8 | } u; 9 | u.s = 0x0102; 10 | if (sizeof(short) == 2) { 11 | if (u.c[0] == 2 && u.c[1] == 1) 12 | printf("little-endian\n"); 13 | else if (u.c[0] == 1 && u.c[1] == 2) 14 | printf("big-endian\n"); 15 | else 16 | printf("unknown\n"); 17 | } else 18 | printf("sizeof(short) == %lu\n", sizeof(short)); 19 | return 0; 20 | } -------------------------------------------------------------------------------- /UNP/03 套接字编程简介/progs/ReadNBytes.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | ssize_t readn(int fd, void *vptr, size_t n) 9 | { 10 | char *ptr = vptr; 11 | size_t nleft = n; 12 | ssize_t nread = 0; 13 | while (nleft > 0) { 14 | if ((nread = read(fd, ptr, nleft)) < 0) { 15 | if (errno = EINTR) 16 | nread = 0; 17 | else 18 | return -1; 19 | } else if (nread == 0) 20 | break; 21 | nleft -= nread; 22 | ptr += nread; 23 | } 24 | return n - nleft; 25 | } 26 | 27 | int main(int argc, char const *argv[]) 28 | { 29 | 30 | return 0; 31 | } -------------------------------------------------------------------------------- /UNP/03 套接字编程简介/progs/VerySlowReadLine.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | ssize_t readline(int fd, void *vptr, size_t maxlen) 9 | { 10 | ssize_t rc = 0; 11 | char *ptr = vptr; 12 | char c = 0; 13 | for (size_t n = 1; n < maxlen; n++) { 14 | again: 15 | if ((rc = read(fd, &c, 1)) == 1) { 16 | *ptr++ = c; 17 | if (c == '\n') 18 | break; 19 | } else if (rc == 0) { 20 | *ptr = 0; 21 | return n - 1; 22 | } else { 23 | if (errno == EINTR) 24 | goto again; 25 | return -1; 26 | } 27 | } 28 | *ptr = 0; 29 | return n; 30 | } 31 | 32 | int main(int argc, char const *argv[]) 33 | { 34 | 35 | return 0; 36 | } -------------------------------------------------------------------------------- /UNP/03 套接字编程简介/progs/WriteNBytes.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | ssize_t writen(int fd, const void *vptr, size_t n) 9 | { 10 | size_t nleft = n; 11 | char *ptr = vptr; 12 | ssize_t nwrite = 0; 13 | while (nleft > 0) { 14 | if((nwrite = write(fd, ptr, nleft)) <= 0) { 15 | if (nwrite < 0 && errno == EINTR) 16 | nwrite = 0; 17 | else 18 | return -1; 19 | } 20 | nleft -= nwrite; 21 | ptr += nwrite; 22 | } 23 | return ptr - (char *)vptr; 24 | } 25 | 26 | int main(int argc, char const *argv[]) 27 | { 28 | 29 | return 0; 30 | } -------------------------------------------------------------------------------- /UNP/03 套接字编程简介/习题.md: -------------------------------------------------------------------------------- 1 | #### P1 为什么诸如此类套接字地址结构的长度之类的值-结果参数要用指针来传递? 2 | * 因为内核要修改该值以通知应用程序 3 | 4 | #### P2 为什么 readn 和 writen 函数都将 void * 型指针转换为 char * 指针? 5 | * 因为 void * 指针没有类型,无法取值。 6 | 7 | #### P3 `inet_aton` 和 `inet_addr` 函数对于接受什么作为点分十进制 IPv4 地址串一直相当随意:允许由小数点分隔的 1 ~ 4 个数,也允许由一个前导的 0x 来指定一个十六进制数,还允许由一个前导的 0 来指定的一个八进制数。`inet_pton` 函数对 IPv4 地址的要求却严格得多,明确要求用三个小数点来分隔四个在 0 ~ 255 之间的十进制数。当指定地址族协议为 `AF_INET6` 时,inet_pton 不允许指定点分十进制数地址,不过有人可能争辩说应该允许,返回值就是对应这个点分十进制串的 IPv4 映射的 IPv6 地址。 8 | #### 试写一个名为 `inet_pton_loose` 的函数,它能处理如下情形: 如果地址族为 `AF_INET` 且 inet_pton 返回 0, 那就调用 `inet_aton` 看是否成功;类似地,如果地址族为 `AF_INET6` 且 `inet_pton` 返回 0,那就调用 `inet_aton` 看是否成功,若成功则返回其 IPv4 映射的 IPv6 地址。 9 | 10 | * [Practise_03.c](https://github.com/YangXiaoHei/Networking/blob/master/UNP/03%20套接字编程简介/progs/Practise_03.c) 11 | 12 | * 运行结果如下 : 13 | 14 | ~~~C 15 | ➜ progs git:(master) ✗ cc Practise_03.c tool/bin_tool.c && ./a.out 16 | 10011101 11001111 00011101 01110111 11111111 11111111 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 17 | ~~~ -------------------------------------------------------------------------------- /UNP/04 基本 TCP 套接字编程/images/tcp_shakehands_queue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/04 基本 TCP 套接字编程/images/tcp_shakehands_queue.png -------------------------------------------------------------------------------- /UNP/04 基本 TCP 套接字编程/images/tcp_shakehands_queue_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/04 基本 TCP 套接字编程/images/tcp_shakehands_queue_2.png -------------------------------------------------------------------------------- /UNP/05 TCP 客户 服务器程序示例/README.md: -------------------------------------------------------------------------------- 1 | * tcpdump 2 | * tcpdump tcp port xxxx 3 | * 抓取 tcp 某个端口 in/out 的帧 4 | 5 | * 服务器进程终止后,关闭该进程打开的所有文件描述符,包括用于套接字收发网络数据的文件描述符,这导致 TCP 发送 FIN 给客户端,而客户端接收到 FIN 后发送 ACK 过来。此时服务器 TCP 处于 `FIN_WAIT_2` 状态。FIN 发送给客户端后在 TCP 套接字接收缓冲区中添加 EOF。如果客户端此时正处于 read 调用中,那么可以发现无数据可读从而关闭套接字文件描述符。但是,由于客户端此时正阻塞在对标准输入文件描述符的读取中,因此无法响应该 FIN 的读取。接下来,客户端从标准输入读取用户输入内容,然后写入文件描述符,服务器接收到数据后,返回 RST,客户端读取 RST 后 readline 返回 -1 错误,然后终止客户端进程,终止客户端进程又导致文件描述符关闭,又给服务器发送 FIN 分组,但服务器仍然以 RST 响应。 -------------------------------------------------------------------------------- /UNP/05 TCP 客户 服务器程序示例/progs/IfConnectRetureBeforeAcceptClient.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | int main(int argc, char const *argv[]) 10 | { 11 | int fd = -1; 12 | if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 13 | perror("socket error!"); 14 | exit(1); 15 | } 16 | 17 | struct sockaddr_in svraddr; 18 | svraddr.sin_family = AF_INET; 19 | svraddr.sin_port = htons(atoi(argv[2])); 20 | if (inet_pton(AF_INET, argv[1], &svraddr.sin_addr) < 0) { 21 | perror("inet_pton error!"); 22 | exit(1); 23 | } 24 | 25 | if (connect(fd, (struct sockaddr *)&svraddr, sizeof(svraddr)) < 0) { 26 | perror("connect error!"); 27 | exit(1); 28 | } 29 | 30 | printf("connect succ! %ld\n", time(NULL)); 31 | 32 | sleep(100); 33 | 34 | return 0; 35 | } -------------------------------------------------------------------------------- /UNP/05 TCP 客户 服务器程序示例/progs/IfConnectRetureBeforeAcceptServer.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | int main(int argc, char const *argv[]) 10 | { 11 | int fd = -1; 12 | if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 13 | perror("socket error!"); 14 | exit(1); 15 | } 16 | 17 | struct sockaddr_in svraddr, cliaddr; 18 | socklen_t clilen = sizeof(cliaddr); 19 | svraddr.sin_family = AF_INET; 20 | svraddr.sin_port = htons(atoi(argv[1])); 21 | svraddr.sin_addr.s_addr = htonl(INADDR_ANY); 22 | 23 | if (bind(fd, (struct sockaddr *)&svraddr, sizeof(svraddr)) < 0) { 24 | perror("bind error!"); 25 | exit(1); 26 | } 27 | 28 | if (listen(fd, 100) < 0) { 29 | perror("listen error!"); 30 | exit(1); 31 | } 32 | 33 | sleep(100); 34 | 35 | int connfd = -1; 36 | if ((connfd = accept(fd, (struct sockaddr *)&svraddr, &clilen)) < 0) { 37 | perror("accept error!"); 38 | exit(1); 39 | } 40 | printf("accept succ! %ld\n", time(NULL)); 41 | 42 | sleep(100); 43 | 44 | return 0; 45 | } -------------------------------------------------------------------------------- /UNP/05 TCP 客户 服务器程序示例/progs/data: -------------------------------------------------------------------------------- 1 | xixixixixixi -------------------------------------------------------------------------------- /UNP/05 TCP 客户 服务器程序示例/progs/fgetsAndfputs.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | void printAllAscii(char *buf, size_t len) 7 | { 8 | for (size_t i = 0; i < len; i++) { 9 | printf("%-4d", buf[i]); 10 | } 11 | } 12 | 13 | int main(int argc, char const *argv[]) 14 | { 15 | /* 16 | * fgets 会自动添加 \0 吗 17 | * ✅ 会 18 | * 19 | * 20 | * fgets 一直读到 \n 才停止吗? 21 | * ❌ 不是,如果缓冲区大小不够,那么只读 bufsize - 1 个字符,然后在最后一个坑填 \0 22 | */ 23 | 24 | printf("\\n = %d\n", '\n'); 25 | printf("a = %d\n", 'a'); 26 | 27 | // char buf[4]; 28 | // memset(buf, 'a', 4); 29 | // fgets(buf, sizeof(buf), stdin); 30 | // printAllAscii(buf, sizeof(buf)); 31 | 32 | /* 33 | * 如果字符串不以 \0 结尾会如何? 34 | * 35 | * fputs 会 GG 36 | */ 37 | // char buf2[4]; 38 | // memset(buf2, 'a', 4); 39 | // memcpy(buf2, "123", 3); 40 | // fputs(buf2, stdout); 41 | 42 | /* 43 | * 如果字符串以 \n 结尾会如何? 44 | * fputs 会 GG 45 | */ 46 | char buf3[4]; 47 | memset(buf3, 'a', 4); 48 | memcpy(buf3, "12\n", 3); 49 | fputs(buf3, stdout); 50 | 51 | /* 52 | * 结论 fputs 会一直读到 \0 53 | */ 54 | 55 | 56 | return 0; 57 | } -------------------------------------------------------------------------------- /UNP/05 TCP 客户 服务器程序示例/习题.md: -------------------------------------------------------------------------------- 1 | #### 1、基于图 5-2 和图 5-3 构造一个 TCP 服务器程序,基于图 5-4 和图 5-5 构造一个 TCP 客户程序。先启动服务器,再启动客户。键入若干文本行以确认客户和服务器正常工作。通过键入 EOF 字符终止客户,并记下时间。在客户主机上使用 netstat 命令验证本连接的客户端在经历 `TIME_WAIT` 状态。此后每 5 秒钟左右执行一次 netstat,查看 `TIME_WAIT` 状态何时结束。该客户主机的网络实现设置的 MSL 有多大? 2 | 3 | * 在 Mac OSX 上,2MSL 为 32 秒,MSL 是 16 秒。 4 | * 在 Linux 上,2MSL 为 1 分钟,MSL 为 30 秒 5 | 6 | #### 2、对于我们的客户/服务器程序,如果我们在运行客户时把它的标准输入重定向到一个二进制文件,将会发生什么。 7 | 8 | * 如果二进制文件内容是 1 0 \n 9 | * 那么客户端通过 fgets 读到数组中的是 1 0 \n 10 | * 客户端调用 strlen(buf) 得到 1,于是把 1 发送给了服务器,然后调用 readline 等待服务器回应。 11 | * 服务器收到 1,然后服务器也同时阻塞在 readline 中,因为没有遇到一个换行符。 12 | * 造成死锁 13 | 14 | #### 3、我们的回射客户/服务器之间的通信与利用 telnet 客户跟我们的回射服务器通信相比较,存在什么差别? 15 | 16 | * 17 | 18 | 19 | #### 4、在 5.12 节的例子中,我们使用 netstat 命令通过查看套接字状态验证了连接终止序列的前两个分组已经发送(来自服务器的 FIN 和来自客户的 ACK)。该序列的后两个分组(来自客户的 FIN 和来自服务器的对该分组的 ACK)会交换吗?如果交换的话,何时交换?如果不交换的话,为什么? 20 | 21 | -------------------------------------------------------------------------------- /UNP/06 IO复用 selet 和 poll 函数/progs/Practise_01.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | struct A { 5 | char a[100]; 6 | }; 7 | 8 | int main(int argc, const char * argv[]) { 9 | 10 | struct A a; 11 | memset(&a, 'c', sizeof(struct A)); 12 | 13 | struct A b; 14 | b = a; 15 | 16 | for (int i = 0; i < 100; i++) { 17 | if (i != 0 && i % 10 == 0) 18 | printf("\n"); 19 | printf("%c", b.a[i]); 20 | } 21 | printf("\n"); 22 | 23 | 24 | return 0; 25 | } -------------------------------------------------------------------------------- /UNP/06 IO复用 selet 和 poll 函数/progs/file: -------------------------------------------------------------------------------- 1 | This is the line one 1 2 | This is the line one 2 3 | This is the line one 3 4 | This is the line one 4 5 | This is the line one 5 6 | This is the line one 6 7 | This is the line one 7 8 | This is the line one 8 9 | This is the line one 9 10 | This is the line one 10 11 | This is the line one 11 12 | This is the line one 12 13 | This is the line one 13 14 | This is the line one 14 15 | This is the line one 15 16 | This is the line one 16 17 | This is the line one 17 18 | This is the line one 18 19 | This is the line one 19 20 | This is the line one 20 21 | -------------------------------------------------------------------------------- /UNP/06 IO复用 selet 和 poll 函数/progs/output: -------------------------------------------------------------------------------- 1 | This is the line one 1 2 | This is the line one 2 3 | This is the line one 3 4 | This is the line one 4 5 | This is the line one 5 6 | This is the line one 6 7 | This is the line one 7 8 | This is the line one 8 9 | This is the line one 9 10 | This is the line one 10 11 | This is the line one 11 12 | This is the line one 12 13 | This is the line one 13 14 | This is the line one 14 15 | This is the line one 15 16 | This is the line one 16 17 | This is the line one 17 18 | This is the line one 18 19 | This is the line one 19 20 | This is the line one 20 21 | server terminated 22 | -------------------------------------------------------------------------------- /UNP/07 套接字选项/images/7.08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/07 套接字选项/images/7.08.png -------------------------------------------------------------------------------- /UNP/07 套接字选项/images/7.09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/07 套接字选项/images/7.09.png -------------------------------------------------------------------------------- /UNP/07 套接字选项/images/7.10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/07 套接字选项/images/7.10.png -------------------------------------------------------------------------------- /UNP/07 套接字选项/progs/DiscardServer.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "../tool/CommonTool.h" 9 | #include "../tool/TimeTool.h" 10 | 11 | int main(int argc, char *argv[]) 12 | { 13 | 14 | if (argc != 2) { 15 | logx("usage : %s ", argv[0]); 16 | exit(1); 17 | } 18 | int listenfd = -1; 19 | if ((listenfd = tcp_server_cb(argv[1], NULL)) < 0) { 20 | logx("tcp_server_cb error!"); 21 | exit(1); 22 | } 23 | 24 | int connfd = -1; 25 | ssize_t nread = 0; 26 | char buf[1024]; 27 | for (;;) { 28 | if ((connfd = accept(listenfd, NULL, NULL)) < 0) { 29 | logx("accept error!"); 30 | break; 31 | } 32 | while ((nread = read(connfd, buf, sizeof(buf))) > 0) { 33 | logx("read %zd bytes, discard it", nread); 34 | } 35 | if (nread < 0) { 36 | logx("read error!"); 37 | } else if (nread == 0) { 38 | logx("client closed connection\n"); 39 | } 40 | close(connfd); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /UNP/07 套接字选项/progs/NagleTest.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include "../../tool/TimeTool.h" 6 | #include "../../tool/CommonTool.h" 7 | #include 8 | #include 9 | #include 10 | 11 | int on; 12 | 13 | int cb(int fd) 14 | { 15 | if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) < 0) { 16 | logx("setsockopt error!"); 17 | return -1; 18 | } 19 | return 0; 20 | } 21 | 22 | int main(int argc, char *argv[]) 23 | { 24 | if (argc != 4) { 25 | logx("usage : %s ", argv[0]); 26 | exit(1); 27 | } 28 | 29 | on = atoi(argv[3]) == 1 ? 0 : 1; 30 | 31 | int fd = -1; 32 | if ((fd = tcp_connect_cb(argv[1], argv[2], NULL)) < 0) { 33 | logx("tcp_connect error!"); 34 | exit(1); 35 | } 36 | 37 | char msg[128]; 38 | memset(msg, 'a', sizeof(msg)); 39 | msg[127] = 0; 40 | for (;;) { 41 | for (int i = 0; i < strlen(msg); i++) { 42 | write(fd, msg + i, 1); 43 | logx("send %c to server", msg[i]); 44 | } 45 | } 46 | close(fd); 47 | } 48 | -------------------------------------------------------------------------------- /UNP/07 套接字选项/progs/Practise_01.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | int main(int argc, char const *argv[]) 9 | { 10 | int fd = -1; 11 | if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 12 | perror("socket fd error!"); 13 | exit(1); 14 | } 15 | 16 | int bufsize = 0; 17 | socklen_t len = sizeof(bufsize); 18 | if (getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &bufsize, &len) < 0) { 19 | perror("getsockopt error!"); 20 | exit(1); 21 | } 22 | 23 | printf("send buff size = %d\n", bufsize); 24 | 25 | len = sizeof(bufsize); 26 | if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &bufsize, &len) < 0) { 27 | perror("getsockopt error!"); 28 | exit(1); 29 | } 30 | 31 | printf("recv buff size = %d\n", bufsize); 32 | 33 | return 0; 34 | } -------------------------------------------------------------------------------- /UNP/11 名字与地址转换/progs/GetHostByName.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | int main(int argc, char const *argv[]) 9 | { 10 | if (argc == 1) { 11 | printf("usage : %s [hostname1, hostname2, ...]\n", argv[0]); 12 | exit(1); 13 | } 14 | 15 | struct hostent *ent = NULL; 16 | while (--argc > 0) { 17 | const char *name = *++argv; 18 | if ((ent = gethostbyname(name)) == NULL) { 19 | printf("gethostbyname error: %s %s\n", name, hstrerror(h_errno)); 20 | continue; 21 | } 22 | 23 | printf("official hostname : %s\n", ent->h_name); 24 | for (char **pptr = ent->h_aliases; *pptr != NULL; pptr++) 25 | printf("\talias : %s\n", *pptr); 26 | 27 | switch(ent->h_addrtype) { 28 | case AF_INET : { 29 | char **pptr = ent->h_addr_list; 30 | for (; *pptr != NULL; pptr++) 31 | printf("\taddress: %s\n", inet_ntoa(*(struct in_addr *)*pptr)); 32 | break; 33 | }; 34 | default : 35 | printf("unknow address type"); 36 | break; 37 | } 38 | } 39 | return 0; 40 | } -------------------------------------------------------------------------------- /UNP/11 名字与地址转换/progs/GetServByName.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | int main(int argc, char const *argv[]) 10 | { 11 | if (argc != 3) { 12 | printf("usage : %s \n", argv[0]); 13 | exit(1); 14 | } 15 | 16 | struct servent *sptr = NULL; 17 | 18 | const char *proto = argv[2]; 19 | if (strcmp(proto, "NULL") == 0) 20 | proto = NULL; 21 | if ((sptr = getservbyname(argv[1], proto)) == NULL) { 22 | perror("getservbyname error!"); 23 | exit(1); 24 | } 25 | 26 | /* 27 | * struct servent { 28 | char *s_name; 29 | char **s_aliases; 30 | int s_port; 31 | char *s_proto; 32 | } 33 | */ 34 | printf("official name = %s\n", sptr->s_name); 35 | for (char **pptr = sptr->s_aliases; *pptr != NULL; pptr++) 36 | printf("\talias = %s\n", *pptr); 37 | printf("port = %d\n", ntohs(sptr->s_port)); 38 | printf("protocol = %s\n", sptr->s_proto); 39 | 40 | return 0; 41 | } -------------------------------------------------------------------------------- /UNP/11 名字与地址转换/progs/GetServByPort.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | int main(int argc, char const *argv[]) 7 | { 8 | if (argc != 3) { 9 | printf("usage : %s \n", argv[0]); 10 | exit(1); 11 | } 12 | 13 | struct servent *sptr = NULL; 14 | if ((sptr = getservbyport(htons(atoi(argv[1])), argv[2])) == NULL) { 15 | printf("getservbyport error! %s\n", hstrerror(h_errno)); 16 | exit(1); 17 | } 18 | 19 | printf("official name = %s\n", sptr->s_name); 20 | for (char **pptr = sptr->s_aliases; *pptr != NULL; ++pptr) 21 | printf("\talias : %s\n", *pptr); 22 | printf("\tport : %d\n", htons(sptr->s_port)); 23 | printf("\tprotocol : %s\n", sptr->s_proto); 24 | return 0; 25 | } -------------------------------------------------------------------------------- /UNP/11 名字与地址转换/progs/Practise_01.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "../../tool/AddrTool.h" 9 | 10 | int main(int argc, char const *argv[]) 11 | { 12 | if (argc != 2) { 13 | printf("usage : %s \n", argv[0]); 14 | exit(1); 15 | } 16 | 17 | const char *hostname = argv[1]; 18 | struct hostent *ent = NULL; 19 | 20 | if ((ent = gethostbyname(hostname)) == NULL) { 21 | printf("gethostname error! %s : %s", hostname, hstrerror(h_errno)); 22 | exit(1); 23 | } 24 | 25 | ent->h_length = 999; 26 | 27 | struct hostent *eachent = NULL; 28 | for (char **pptr = ent->h_addr_list; *pptr != NULL; pptr++) { 29 | if ((eachent = gethostbyaddr((struct in_addr *)*pptr, 4, ent->h_addrtype)) == NULL) { 30 | char *ip = inet_ntoa(*(struct in_addr *)*pptr); 31 | printf("gethostbyaddr error! %s : %s\n", ip, hstrerror(h_errno)); 32 | continue; 33 | } 34 | printf("%d\n", ent->h_length); 35 | char *ip = inet_ntoa(*(struct in_addr *)*pptr); 36 | printf("%s -> h_name = %s\n", ip, eachent->h_name); 37 | } 38 | return 0; 39 | } -------------------------------------------------------------------------------- /UNP/11 名字与地址转换/习题.md: -------------------------------------------------------------------------------- 1 | #### 11.1 修改图 11-3 中的程序,为每个返回的地址调用 gethostbyaddr,然后显示它返回的 h_name, 首先指定一个只有单个 IP 地址的主机名运行本程序,然后指定一个有多个 IP 地址的主机名运行本程序,将会发生什么? 2 | 3 | * [Practise_01]() 4 | 5 | ~~~C 6 | ➜ progs git:(master) ✗ ./a.out qq.com 7 | 111.161.64.48 -> h_name = dns48.online.tj.cn 8 | 111.161.64.40 -> h_name = dns40.online.tj.cn 9 | ~~~ 10 | 11 | * ⚠️ 据推测,在 linux 上,gethostbyname 返回了静态的内存空间,因此连续两次调用 gethostbyname,第二次结果会覆盖上一次的。但是 gethostbyname 和 gethostbyaddr 使用的是两个独立的静态内存空间。因此调用 gethostbyname 后再调用 gethostbyaddr 不会覆盖上一次的。而在 Mac 上,gethostbyname 和 gethostbyname 的实现似乎不会出现覆盖现象。 12 | 13 | #### 11.2 修复上个习题中出现的问题。 14 | 15 | * 使用可重入版本的 `gethostbyaddr_r` 和 `gethostbyname_r` 16 | 17 | #### 11.3 将服务名指定为 chargen,运行图 11-4 中的程序。 18 | 19 | * [Practise_02_server.c]() 20 | * [Practise_02_client.c]() 21 | * 这题没有做出来,进程间的同步不好搞,似乎走入了死胡同。 22 | 23 | 24 | -------------------------------------------------------------------------------- /UNP/13 守护进程和 inetd 超级服务器/progs/CreateDaemonProcess.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | int daemon_init(const char *pname, int facility) 11 | { 12 | pid_t pid; 13 | if ((pid = fork()) < 0) { 14 | perror("fork error!"); 15 | return -1; 16 | } else if (pid) 17 | _exit(0); 18 | 19 | if (setsid() < 0) 20 | return -1; 21 | 22 | if (signal(SIGHUP, SIG_IGN) == SIG_ERR) 23 | return -1; 24 | 25 | if ((pid = fork()) < 0) { 26 | perror("fork error"); 27 | return -1; 28 | } else if (pid) 29 | _exit(0); 30 | 31 | chdir("/"); 32 | 33 | for (int i = 0; i < 64; i++) 34 | close(i); 35 | 36 | open("/dev/null", O_RDONLY); // stdin 37 | open("/dev/null", O_RDWR); // stdout 38 | open("/dev/null", O_RDWR); // stderr 39 | 40 | openlog(pname, LOG_PID, facility); 41 | 42 | return 0; 43 | } 44 | 45 | int main(int argc, char const *argv[]) 46 | { 47 | daemon_init(argv[0], LOG_USER); 48 | 49 | syslog(LOG_INFO, "hahahahahah"); 50 | 51 | while (1); 52 | 53 | return 0; 54 | } -------------------------------------------------------------------------------- /UNP/13 守护进程和 inetd 超级服务器/progs/TCPDaytimeServerExecByXinetd.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include "../../tool/AddrTool.h" 11 | 12 | int main(int argc, char const *argv[]) 13 | { 14 | struct sockaddr_storage cliaddr; 15 | socklen_t len = sizeof(cliaddr); 16 | if (getpeername(0, (struct sockaddr *)&cliaddr, &len) < 0) { 17 | syslog(LOG_INFO, "getpeername error! %s\n", strerror(errno)); 18 | exit(1); 19 | } 20 | 21 | openlog(argv[0], LOG_PID, LOG_INFO); 22 | 23 | char *addrInfo = getAddrInfo((struct sockaddr_in *)&cliaddr); 24 | syslog(LOG_INFO, "tcp connection from %s", addrInfo); 25 | free(addrInfo); 26 | 27 | time_t ticks = time(NULL); 28 | char buf[1024]; 29 | snprintf(buf, sizeof(buf), "%.24s", ctime(&ticks)); 30 | if (write(0, buf, strlen(buf)) < 0) { 31 | syslog(LOG_INFO, "write error! : %s\n", strerror(errno)); 32 | } 33 | close(0); 34 | exit(0); 35 | } -------------------------------------------------------------------------------- /UNP/13 守护进程和 inetd 超级服务器/progs/UDPDaytimeServerExecByXinetd.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include "../../tool/AddrTool.h" 11 | 12 | int main(int argc, char const *argv[]) 13 | { 14 | struct sockaddr_storage cliaddr; 15 | socklen_t len = sizeof(cliaddr); 16 | 17 | openlog(argv[0], LOG_PID, LOG_INFO); 18 | 19 | char c = 0; 20 | if (recvfrom(0, &c, 1, 0, (struct sockaddr *)&cliaddr, &len) < 0) { 21 | syslog(LOG_INFO, "recvfrom error!"); 22 | exit(1); 23 | } 24 | 25 | char *addrInfo = getAddrInfo((struct sockaddr_in *)&cliaddr); 26 | syslog(LOG_INFO, "udp req from %s\n", addrInfo); 27 | free(addrInfo); 28 | 29 | time_t ticks = time(NULL); 30 | char buf[1024]; 31 | snprintf(buf, sizeof(buf), "%.24s", ctime(&ticks)); 32 | if (sendto(0, buf, strlen(buf), 0, (struct sockaddr *)&cliaddr, len) < 0) { 33 | syslog(LOG_INFO, "sento error! : %s\n", strerror(errno)); 34 | exit(1); 35 | } 36 | close(0); 37 | exit(0); 38 | } -------------------------------------------------------------------------------- /UNP/13 守护进程和 inetd 超级服务器/习题.md: -------------------------------------------------------------------------------- 1 | #### 13.1 图 13-5 中如果我们把 `daemon_init` 调用挪到检查命令行参数之前,使得 `err_quit` 调用位于 `daemon_init` 调用之后,那会发生什么? 2 | 3 | * `err_quit` 如果输出内容的话,写到了 `/var/log/xxx` 的文件中,而不是控制台标准输出中。 4 | 5 | #### 13.2 对于由 inted 内部处理的 5 个服务(图 2-18),考虑每个服务各有一个 TCP 版本和一个 UDP 版本,这样总共 10 个服务器的实现中,哪些用到了 fork 调用,哪些不需要 fork 调用? 6 | 7 | * 总共 5 个服务,echo, discard, daytime, time, chargen 8 | * TCP 版本的 echo discard 和 chargen 需要与客户端一直保持连接,因此需要 fork 子进程,而 TCP 版本的 daytime 和 time 只需要给一个返包然后立刻关闭连接即可,因此不需要 fork 子进程。 9 | * 5 个服务的 UDP 版本都不需要 fork 子进程。 10 | 11 | #### 13.3 如果我们创建一个 UDP 套接字,把端口 7 (图 2-18 中标准 echo 服务器所用端口) 捆绑到其上,然后把一个 UDP 数据报发送到某个标准 chargen 服务器,将会发生什么? 12 | 13 | * chargen 返回的数据报导致 echo 回显其返回的字符串,因此会产生永无止尽的回显。 14 | -------------------------------------------------------------------------------- /UNP/14 高级 IO 函数/README.md: -------------------------------------------------------------------------------- 1 | * [TimeoutConnectClientBySignal.c](https://github.com/YangXiaoHei/Networking/blob/master/UNP/14%20高级%20IO%20函数/progs/TimeoutConnectClientBySignal.c) 使用 SIGALRM 给 connect 设置超时有两个缺陷: 2 | * 1、使用 SIGALRM 只能缩短超时时间,因为 connect 有一个内置的超时 75 s。 3 | * 2、信号与多线程的交互很困难,因此只在单线程化的程序中使用该技术。 4 | * 3、覆盖了原有的 alarm 设置,这一点在习题 [Practise_02_client.c](https://github.com/YangXiaoHei/Networking/blob/master/UNP/14%20高级%20IO%20函数/progs/Practise_02_client.c) 已经修复。 5 | 6 | * ⚠️⚠️⚠️ UNPv1 第 3 版书中所说的套接字选项 `IP_RECVDSTADDR` 在 linux 内核 `GNU/Linux 4.15.0-42-generic x86_64` 中不存在,取而代之的是 `IP_RECVORIGDSTADDR ` 选项,切记! 7 | 8 | * 对于套接字描述符,不要搭配标准 IO 库一起使用,会遇到缓冲问题(其实可以解决)。 -------------------------------------------------------------------------------- /UNP/14 高级 IO 函数/progs/StrcpyAndSnprintfTest.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int main(int argc, char const *argv[]) 5 | { 6 | char *msg = "hansonyang"; 7 | char buf[64]; 8 | 9 | 10 | /* strcpy 会自动在 buf 后填 \0 */ 11 | memset(buf, 'a', sizeof(buf)); 12 | strcpy(buf, msg); 13 | printf("%s\n", buf); 14 | 15 | /* strncpy 不会自动添加 \0 */ 16 | memset(buf, 'a', sizeof(buf)); 17 | strncpy(buf, msg, strlen(msg)); 18 | printf("%s\n", buf); 19 | 20 | /* snprintf 也会自动在 buf 后填 \0 */ 21 | memset(buf, 'a', sizeof(buf)); 22 | snprintf(buf, sizeof(buf), "hello world"); 23 | printf("%s\n", buf); 24 | return 0; 25 | } -------------------------------------------------------------------------------- /UNP/15 Unix 域协议/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/15 Unix 域协议/README.md -------------------------------------------------------------------------------- /UNP/15 Unix 域协议/progs/BindPathForUnixFd.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | int main(int argc, char const *argv[]) 10 | { 11 | if (argc != 2) { 12 | printf("usage : %s \n", argv[0]); 13 | exit(1); 14 | } 15 | 16 | int fd = -1; 17 | if ((fd = socket(AF_LOCAL, SOCK_STREAM, 0)) < 0) { 18 | perror("unix fd create fail!"); 19 | exit(1); 20 | } 21 | 22 | /* 域套接字绑定的地址不能存在,否则将 bind 失败 */ 23 | unlink(argv[1]); 24 | 25 | struct sockaddr_un addr1, addr2; 26 | bzero(&addr1, sizeof(addr1)); 27 | addr1.sun_family = AF_LOCAL; 28 | strncpy(addr1.sun_path, argv[1], sizeof(addr1.sun_path) - 1); 29 | 30 | if (bind(fd, (struct sockaddr *)&addr1, SUN_LEN(&addr1)) < 0) { 31 | perror("bind error!"); 32 | exit(1); 33 | } 34 | printf("SUN_LEN = %lu\n", SUN_LEN(&addr1)); 35 | 36 | socklen_t len = sizeof(addr2); 37 | if (getsockname(fd, (struct sockaddr *)&addr2, &len) < 0) { 38 | perror("getsockname error!"); 39 | exit(1); 40 | } 41 | 42 | printf("bound name = %s returned len = %d\n", addr2.sun_path, len); 43 | 44 | return 0; 45 | } -------------------------------------------------------------------------------- /UNP/15 Unix 域协议/progs/SocketPairTest.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | int main(int argc, char const *argv[]) 9 | { 10 | int fds[2]; 11 | if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fds) < 0) { 12 | perror("socketpair error!"); 13 | exit(1); 14 | } 15 | 16 | int svrfd = fds[0]; 17 | int clifd = fds[1]; 18 | 19 | char *msg = "hello world"; 20 | 21 | ssize_t nwrite = 0, nread = 0; 22 | 23 | if ((nwrite = write(svrfd, msg, strlen(msg))) < 0) { 24 | perror("write error!"); 25 | exit(1); 26 | } 27 | 28 | char buf[1024]; 29 | if ((nread = read(clifd, buf, sizeof(buf))) < 0) { 30 | perror("read error!"); 31 | exit(1); 32 | } 33 | buf[nread] = 0; 34 | printf("%s\n", buf); 35 | 36 | if ((nwrite = write(clifd, msg, strlen(msg))) < 0) { 37 | perror("write error!"); 38 | exit(1); 39 | } 40 | 41 | if ((nread = read(svrfd, buf, sizeof(buf))) < 0) { 42 | perror("read error!"); 43 | exit(1); 44 | } 45 | buf[nread] = 0; 46 | printf("%s\n", buf); 47 | 48 | return 0; 49 | } -------------------------------------------------------------------------------- /UNP/15 Unix 域协议/progs/unixFd_Practise_03_client.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | int main(int argc, char const *argv[]) 12 | { 13 | setbuf(stdout, NULL); 14 | 15 | int fd = -1; 16 | if ((fd = socket(AF_LOCAL, SOCK_STREAM, 0)) < 0) { 17 | perror("socket fd create fail!"); 18 | exit(1); 19 | } 20 | 21 | const char *pathname = "unix_hanson"; 22 | 23 | struct sockaddr_un svraddr; 24 | bzero(&svraddr, sizeof(svraddr)); 25 | strcpy(svraddr.sun_path, pathname); 26 | svraddr.sun_family = AF_LOCAL; 27 | if (connect(fd, (struct sockaddr *)&svraddr, SUN_LEN(&svraddr)) < 0) { 28 | perror("connect error!"); 29 | exit(1); 30 | } 31 | 32 | sleep(5); 33 | 34 | char buf[1024]; 35 | ssize_t nread = 0; 36 | while ((nread = read(fd, buf, sizeof(buf))) > 0) { 37 | buf[nread] = 0; 38 | printf("nread = %zd content = [%s]\n", nread, buf); 39 | } 40 | if (nread == 0) { 41 | printf("server cut connection\n"); 42 | } else { 43 | perror("read error!"); 44 | } 45 | 46 | return 0; 47 | } -------------------------------------------------------------------------------- /UNP/16 非阻塞式 IO/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/16 非阻塞式 IO/README.md -------------------------------------------------------------------------------- /UNP/16 非阻塞式 IO/images/img_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/16 非阻塞式 IO/images/img_1.jpg -------------------------------------------------------------------------------- /UNP/16 非阻塞式 IO/images/img_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/16 非阻塞式 IO/images/img_2.jpg -------------------------------------------------------------------------------- /UNP/16 非阻塞式 IO/images/img_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/16 非阻塞式 IO/images/img_3.jpg -------------------------------------------------------------------------------- /UNP/16 非阻塞式 IO/images/img_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/16 非阻塞式 IO/images/img_4.jpg -------------------------------------------------------------------------------- /UNP/16 非阻塞式 IO/images/img_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/16 非阻塞式 IO/images/img_5.jpg -------------------------------------------------------------------------------- /UNP/16 非阻塞式 IO/images/img_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/16 非阻塞式 IO/images/img_6.jpg -------------------------------------------------------------------------------- /UNP/16 非阻塞式 IO/progs/WriteFile.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | int main(int argc, char const *argv[]) 10 | { 11 | srand((unsigned int)time(NULL)); 12 | int fd = open("data", O_RDWR | O_CREAT, 0644); 13 | const char *msg = "abcdefghijklmnopqrstuvwxyz"; 14 | for (int i = 0; i < 50000; i++) { 15 | int ridx = rand() % strlen(msg); 16 | write(fd, &msg[ridx], 1); 17 | } 18 | return 0; 19 | } -------------------------------------------------------------------------------- /UNP/16 非阻塞式 IO/progs/output: -------------------------------------------------------------------------------- 1 | 20:52:27.984798: fd = 3 connect invoked 2 | 20:52:27.985584: fd = 4 connect invoked 3 | 20:52:27.985648: fd = 5 connect invoked 4 | 20:52:27.985701: fd = 6 connect invoked 5 | 20:52:27.985746: fd = 7 connect invoked 6 | 20:52:28.000097: fd = 5 connect succ! sockaddr is [192.168.0.100:49922] 7 | 20:52:28.000248: fd = 3 connect succ! sockaddr is [192.168.0.100:49920] 8 | 20:52:28.000274: fd = 4 connect succ! sockaddr is [192.168.0.100:49921] 9 | 20:52:28.000294: fd = 6 connect succ! sockaddr is [192.168.0.100:49923] 10 | 20:52:28.005051: fd = 7 connect succ! sockaddr is [192.168.0.100:49924] 11 | -------------------------------------------------------------------------------- /UNP/16 非阻塞式 IO/progs/run_block.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | cc WebClientMultiConnectDownload_Block.c TimeTool.c && ./a.out hansonyang.com 50001 img_1.jpg img_2.jpg img_3.jpg img_4.jpg img_5.jpg img_6.jpg 4 | -------------------------------------------------------------------------------- /UNP/16 非阻塞式 IO/progs/run_nonblock.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | conn=5 4 | 5 | if [ $# -eq 1 ] 6 | then 7 | conn=$1 8 | fi 9 | 10 | cc WebClientMultiConnectDownload_Nonblock.c TimeTool.c && ./a.out $conn hansonyang.com 50001 img_1.jpg img_2.jpg img_3.jpg img_4.jpg img_5.jpg img_6.jpg 11 | -------------------------------------------------------------------------------- /UNP/16 非阻塞式 IO/progs/tcpdump_output: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/16 非阻塞式 IO/progs/tcpdump_output -------------------------------------------------------------------------------- /UNP/16 非阻塞式 IO/progs/timeline: -------------------------------------------------------------------------------- 1 | 12:58:05.234255 IP client.6623 > server.50001: Flags [S], seq 3699206896, win 65535, length 0 2 | 12:58:05.234288 IP server.50001 > client.6623: Flags [S.], seq 970044221, ack 3699206897, win 28960, length 0 3 | 12:58:05.260216 IP client.6623 > server.50001: Flags [.], ack 1, win 2056, length 0 4 | 12:58:05.260268: busy server cannot handle next accept right away! sleep 5 sec to simulate 5 | 12:58:06.262243 IP client.6623 > server.50001: Flags [R.], seq 1, ack 1, win 2056length 6 | 12:58:10.260521: busy server now is ready to handle next accept! 7 | 12:58:10.260585: TCP connection from [client:6623] 8 | 12:58:10.261624: read error! Connection reset by peer 9 | -------------------------------------------------------------------------------- /UNP/16 非阻塞式 IO/习题.md: -------------------------------------------------------------------------------- 1 | #### 16.1 在关于图 16-10 的讨论中我们提到,父进程必须调用 shutdown 而不是 close。这是为什么? 2 | 3 | * close 的默认动作是立即返回,丢弃接收缓冲区中所有数据,尝试发送发送缓冲区中数据,如果调用 close,那么假如在 close 后服务器的数据才到达,那么这些数据将被全部丢弃。 4 | * shutdown 和 `SHUT_WR` 的默认动作是发送发送缓冲区中所有数据,后接一个 FIN。而不影响接收缓冲区。 5 | 6 | #### 16.2 在图 16-10 中,如果服务器进程过早终止,而客户子进程收到来自服务器的 EOF 后不通知父进程就终止,将会发生什么? 7 | 8 | * 子进程不通知父进程,那么父进程将继续向套接字写数据,于是第一个发送出去的分组导致服务器以 RST 响应,继续对收到 RST 的套接字写数据,导致内核向进程发送 SIGPIPE 信号。 9 | 10 | #### 16.3 在图 16-10 中,如果父进程在子进程之前意外死亡,而子进程随后从套接字读到 EOF,将会发生什么? 11 | 12 | * 子进程将被 init 进程领养,而 kill 无权向 init 发送信号,但是如果进程以超级用户特权运行就不一样了,因此需要检查 getppid 的返回值,如果是 1 的话就不发信号。 13 | 14 | #### 16.4 在图 16-11 中如果删掉以下两行将会发生什么? 15 | 16 | ~~~ 17 | if (n == 0) 18 | goto done; 19 | ~~~ 20 | 21 | * select 将被调用,并且返回套接字可写事件。因此在 n == 0 时直接 goto done 可以避免 select 调用。 22 | 23 | #### 16.5 我们在 16.3 节说过,来自对端的数据有可能在本端的 connect 调用返回前到达套接字。这是如何发生的? 24 | 25 | * 客户端的 connect 是在收到服务器的 ACK-SYN 后返回的,因此假如客户端主机比较忙,必须先处理完其他数据,再处理这个 ACK-SYN,那么此时服务器可能已经发过来了很多数据,因此这些数据是在 connect 返回之前就到达套接字的。 26 | 27 | -------------------------------------------------------------------------------- /UNP/17 ioctl 操作/README.md: -------------------------------------------------------------------------------- 1 | * 仔细研读代码 [InterfaceTool.c](https://github.com/YangXiaoHei/Networking/blob/master/UNP/17%20ioctl%20操作/progs/InterfaceTool.c) 注意理解是如何修复作者在 UNPv3 中 `len = sizeof(struct sockaddr)` 所导致的 bug 的。 2 | 3 | * 使用 ioctl 可以做的事 4 | * FIONREAD 获取接收缓冲区中的排队数据量 5 | * SIOCGIFCONF 获取所有接口信息 struct ifreq 结构体中存储。 6 | * 一定要注意缓冲区的分配,以及缓冲区中如何寻找下一个 struct ifreq,需要使用 `sizeof(test.ifr_ifru)` 7 | * 使用 SIOGIFFLAGS 获取接口标志 8 | * IFF_UP // 是否处于工作状态 9 | * IFF_POINTOPOINT 10 | * IFF_LOOPBACK // 是否是环回地址接口 11 | * IFF_BROADCAST // 是否支持广播 12 | * IFF_MULTICAST // 是否支持多播 13 | * 使用 SIOGIFMTU 获取 MTU 14 | * 使用 SIOCGIFBRDADDR 获取广播地址 15 | * 使用 SIOCGIFMULTIADDR 获取多播地址 16 | * 使用 SIOCGIFDSTADDR 获取点对点地址 17 | * 使用 SIOCGARP 获取 arp 映射 -- 仅对于支持的操作系统来说。。然而据我测试,Mac 上没有 SIOCGARP 宏定义,在 linux 上,使用 ioctl(fd, SIOCGARP, xxx) 无论我传什么,都是报错。测试程序 [ARPOperation.c](https://github.com/YangXiaoHei/Networking/blob/master/UNP/17%20ioctl%20操作/progs/ARPOperation.c) -------------------------------------------------------------------------------- /UNP/17 ioctl 操作/progs/ARPOperation.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | int main(int argc, char const *argv[]) 11 | { 12 | if (argc != 2) { 13 | printf("usage : %s \n", argv[0]); 14 | exit(1); 15 | } 16 | 17 | struct sockaddr_in addr; 18 | bzero(&addr, sizeof(addr)); 19 | addr.sin_family = AF_INET; 20 | addr.sin_port = 0; 21 | addr.sin_addr.s_addr = inet_addr(argv[1]); 22 | 23 | struct arpreq req; 24 | memcpy(&req.arp_pa, &addr, sizeof(struct sockaddr_in)); 25 | 26 | int fd = -1; 27 | if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { 28 | perror("socket error!"); 29 | exit(1); 30 | } 31 | 32 | if (ioctl(fd, SIOCGARP, &req) < 0) { 33 | perror("ioctl error!"); 34 | exit(1); 35 | } 36 | 37 | char *ptr = &req.arp_pa.sa_data[0]; 38 | printf("%02x:%02x:%02x:%02x:%02x:%02x\n", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]); 39 | 40 | return 0; 41 | } -------------------------------------------------------------------------------- /UNP/17 ioctl 操作/progs/InterfaceTool.h: -------------------------------------------------------------------------------- 1 | #ifndef _INTERFACE_TOOL_H_ 2 | #define _INTERFACE_TOOL_H_ 3 | 4 | #define IFI_NAME 16 5 | #define IFI_HADDR 8 /* why 8 */ 6 | 7 | struct ifi_info { 8 | char ifi_name[IFI_NAME]; 9 | short ifi_index; 10 | short ifi_mtu; 11 | unsigned char ifi_haddr[IFI_HADDR]; 12 | unsigned short ifi_hlen; 13 | short ifi_flags; 14 | short ifi_myflags; 15 | struct sockaddr *ifi_addr; 16 | struct sockaddr *ifi_brdaddr; 17 | struct sockaddr *ifi_dstaddr; 18 | struct ifi_info *ifi_next; 19 | }; 20 | 21 | #define IFI_ALIAS 1 22 | 23 | struct ifi_info *get_ifi_info(int family, int doaliaes); 24 | struct iff_info *Get_ifi_info(int family, int doaliaes); 25 | void free_ifi_info(struct ifi_info *tofree); 26 | 27 | #endif -------------------------------------------------------------------------------- /UNP/18 路由套接字/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/18 路由套接字/README.md -------------------------------------------------------------------------------- /UNP/18 路由套接字/progs/CheckIfUDPChecksumEnable.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | int main(int argc, char const *argv[]) 13 | { 14 | int mib[4], val; 15 | size_t len; 16 | mib[0] = CTL_NET; 17 | mib[1] = AF_INET; 18 | mib[2] = IPPROTO_UDP; 19 | mib[3] = UDPCTL_CHECKSUM; 20 | len = sizeof(val); 21 | 22 | if (sysctl(mib, 4, &val, &len, NULL, 0) < 0) { 23 | perror("sysctl error!"); 24 | exit(1); 25 | } 26 | printf("udp checksum flag : %d\n", val); 27 | return 0; 28 | } -------------------------------------------------------------------------------- /UNP/18 路由套接字/progs/InterfaceTool_v2.h: -------------------------------------------------------------------------------- 1 | #ifndef _INTERFACE_TOOL_H_ 2 | #define _INTERFACE_TOOL_H_ 3 | 4 | #define IFI_NAME 16 5 | #define IFI_HADDR 8 /* why 8 */ 6 | 7 | struct ifi_info { 8 | char ifi_name[IFI_NAME]; 9 | short ifi_index; 10 | short ifi_mtu; 11 | unsigned char ifi_haddr[IFI_HADDR]; 12 | unsigned short ifi_hlen; 13 | short ifi_flags; 14 | short ifi_myflags; 15 | struct sockaddr *ifi_addr; 16 | struct sockaddr *ifi_brdaddr; 17 | struct sockaddr *ifi_dstaddr; 18 | struct ifi_info *ifi_next; 19 | }; 20 | 21 | #define IFI_ALIAS 1 22 | 23 | struct ifi_info *get_ifi_info(int family, int doaliaes); 24 | struct iff_info *Get_ifi_info(int family, int doaliaes); 25 | void free_ifi_info(struct ifi_info *tofree); 26 | 27 | #endif -------------------------------------------------------------------------------- /UNP/18 路由套接字/progs/RoundUpTest.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #define ROUNDUP(a, size) (((a) & ((size) - 1)) ? (1 + ((a) | ((size) - 1))) : (a)) 5 | 6 | int main(int argc, char const *argv[]) 7 | { 8 | for (int i = 0; i < 20; i++) { 9 | printf("%d roundup to 8 ---- %d\n",i, ROUNDUP(i, 8)); 10 | } 11 | printf("\n"); 12 | for (int i = 0; i < 20; i++) { 13 | printf("%d roundup to 16 ---- %d\n",i, ROUNDUP(i, 16)); 14 | } 15 | return 0; 16 | } -------------------------------------------------------------------------------- /UNP/18 路由套接字/习题.md: -------------------------------------------------------------------------------- 1 | #### 18.1 对于一个名为 eth10 且链路层地址是一个 64 位 IEEE EUI-64 地址的接口而言,你预期它的数据链路套接字地址结构中的 `sdl_len` 成员会是什么? 2 | 3 | ~~~C 4 | struct sockaddr_dl { 5 | u_char sdl_len; /* Total length of sockaddr */ 6 | u_char sdl_family; /* AF_LINK */ 7 | u_short sdl_index; /* if != 0, system given index for interface */ 8 | u_char sdl_type; /* interface type */ 9 | u_char sdl_nlen; /* interface name length, no trailing 0 reqd. */ 10 | u_char sdl_alen; /* link level address length */ 11 | u_char sdl_slen; /* link layer selector length */ 12 | char sdl_data[12]; /* minimum work area, can be larger; 13 | contains both if name and ll address */ 14 | #ifndef __APPLE__ 15 | /* For TokenRing */ 16 | u_short sdl_rcf; /* source routing control */ 17 | u_short sdl_route[16]; /* source routing information */ 18 | #endif 19 | }; 20 | ~~~ 21 | 22 | * 由上图可知,除了 sdl_data 外总共需要 8 字节,因此再加上名字 "eth10" 5 个字节和地址 8 个字节,总共是 21 字节,那么根据 8 字节对齐,则向上舍入到 24 字节。 23 | 24 | #### 18.2 图 18-6 种若在调用 write 之前禁止 `SO_USELOOPBACK` 套接字选项,将会发生什么? 25 | 26 | * [Practise_02.c](https://github.com/YangXiaoHei/Networking/blob/master/UNP/18%20路由套接字/progs/Practise_02.c) 27 | * 该选项默认是开启的,如果被禁止,那么内核不会向进程发送数据,该程序会阻塞在 read 调用上。 -------------------------------------------------------------------------------- /UNP/22 高级 UDP 套接字编程/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/22 高级 UDP 套接字编程/README.md -------------------------------------------------------------------------------- /UNP/22 高级 UDP 套接字编程/progs/CreateData.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | int main(int argc, char const *argv[]) 10 | { 11 | int bytes = 100 << 10; /* 3M */ 12 | if (argc == 2) 13 | bytes = atoi(argv[1]) << 10; 14 | 15 | if (access("data", F_OK) == 0) 16 | remove("data"); 17 | 18 | srand((unsigned int)time(NULL)); 19 | int fd = open("data", O_RDWR | O_CREAT, 0644); 20 | const char *msg = "abcdefghijklmnopqrstuvwxyz"; 21 | for (int i = 0; i < bytes; i++) { 22 | int ridx = rand() % strlen(msg); 23 | write(fd, &msg[ridx], 1); 24 | } 25 | return 0; 26 | } 27 | -------------------------------------------------------------------------------- /UNP/22 高级 UDP 套接字编程/progs/reliable_udp.h: -------------------------------------------------------------------------------- 1 | #ifndef _RELIABLE_UDP_H_ 2 | #define _RELIABLE_UDP_H_ 3 | 4 | struct rtt_info { 5 | float rtt_rtt; /* 测量得出的往返时间 */ 6 | float rtt_srtt; /* 估算的往返时间 */ 7 | float rtt_rttvar; /* 波动 */ 8 | float rtt_rto; /* 计算得出的超时估计值 rtt_rto = rtt_srtt + 4 * rtt_rttvar */ 9 | int rtt_nretrans; /* 重传的次数 */ 10 | long rtt_base; /* 开始的时间点 */ 11 | }; 12 | 13 | #define RTT_RXTMIN 2 14 | #define RTT_RXTMAX 60 15 | #define RTT_MAXNRETRANS 4 16 | /* 17 | * 初始化控制信息 18 | */ 19 | void rtt_init(struct rtt_info *); 20 | 21 | /* 22 | * 将重传次数置为 0 23 | */ 24 | void rtt_newpack(struct rtt_info *); 25 | /* 26 | * 将 rto 向上舍入到整数 27 | */ 28 | int rtt_start(struct rtt_info *); 29 | /* 30 | * 结束一次收发,重新计算 rtt, rttvar rto 31 | */ 32 | void rtt_stop(struct rtt_info *, long); 33 | /* 34 | * 当发生超时时,该函数负责执行指数退避,累加重传次数,若达到阈值则报错 35 | */ 36 | int rtt_timeout(struct rtt_info *); 37 | /* 38 | * 返回本次 udp 发送的相对时间戳 39 | */ 40 | long rtt_ts(struct rtt_info *); 41 | 42 | #endif 43 | -------------------------------------------------------------------------------- /UNP/22 高级 UDP 套接字编程/progs/reliable_udp_review.h: -------------------------------------------------------------------------------- 1 | #ifndef _RELIABLE_UDP_REVIEW_H_ 2 | #define _RELIABLE_UDP_REVIEW_H_ 3 | 4 | struct rtt_info { 5 | float rtt_rtt; /* 当次测量的RTT */ 6 | float rtt_srtt; /* 平滑过渡的估算 RTT */ 7 | float rtt_rttvar; /* 波动 */ 8 | float rtt_rto; /* 计算得到的本次超时估计 */ 9 | long rtt_base; /* 发送一次 udp 报文的开始时间戳 */ 10 | int rtt_nretrans; /* 重传的次数 */ 11 | }; 12 | 13 | #define RTT_MIN 2 14 | #define RTT_MAX 60 15 | #define RTT_MAXNTRANS 4 16 | 17 | int rtt_start(struct rtt_info *); 18 | void rtt_newpack(struct rtt_info *); 19 | int rtt_timeout(struct rtt_info *); 20 | void rtt_init(struct rtt_info *); 21 | void rtt_stop(struct rtt_info *, long ms); 22 | long rtt_ts(struct rtt_info *); 23 | 24 | #endif 25 | -------------------------------------------------------------------------------- /UNP/22 高级 UDP 套接字编程/习题.md: -------------------------------------------------------------------------------- 1 | #### 22.1 在图 22-18 中为什么有两次 printf 调用? 2 | * 因为函数内部使用的是一个静态内存,在同一个函数上传两次参数,其中后调用的参数会覆盖前者的。 3 | 4 | #### 22.2 dg_send_recv 能否返回 0? 5 | * 可以,这代表除了报头外没有数据。 6 | 7 | #### 22.3 重新编写 dg_send_recv,改用 select 及其定时器取代 alarm、SIGALRM、sigsetjmp 和 siglongjmp 8 | 9 | * [`UDPEchoClient_Reliable_select.c`](https://github.com/YangXiaoHei/Networking/blob/master/UNP/22%20高级%20UDP%20套接字编程/progs/UDPEchoClient_Reliable_select.c) 10 | -------------------------------------------------------------------------------- /UNP/24 带外数据/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/24 带外数据/README.md -------------------------------------------------------------------------------- /UNP/24 带外数据/progs/OOBMarkCover_client.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | int main(int argc, char *argv[]) 10 | { 11 | int fd = -1; 12 | if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 13 | perror("socket fd create fail!"); 14 | exit(1); 15 | } 16 | struct sockaddr_in svraddr; 17 | bzero(&svraddr, sizeof(svraddr)); 18 | svraddr.sin_family = AF_INET; 19 | svraddr.sin_port = htons(atoi(argv[2])); 20 | svraddr.sin_addr.s_addr = inet_addr(argv[1]); 21 | 22 | if (connect(fd, (struct sockaddr *)&svraddr, sizeof(svraddr)) < 0) { 23 | perror("connect error!"); 24 | exit(1); 25 | } 26 | 27 | send(fd, "123", 3, 0); 28 | 29 | send(fd, "4", 1, MSG_OOB); 30 | 31 | send(fd, "567", 3, 0); 32 | 33 | send(fd, "8", 1, MSG_OOB); 34 | } 35 | -------------------------------------------------------------------------------- /UNP/24 带外数据/progs/client_heartbeat_helper.h: -------------------------------------------------------------------------------- 1 | #ifndef _HEARTBEAT_CLIENT_H_ 2 | #define _HEARTBEAT_CLIENT_H_ 3 | 4 | void heartbeat_client(int fd, int sec, int max); 5 | 6 | #endif 7 | -------------------------------------------------------------------------------- /UNP/24 带外数据/progs/server_heartbeat_helper.h: -------------------------------------------------------------------------------- 1 | #ifndef _HEARTBEAT_SERVER_H_ 2 | #define _HEARTBEAT_SERVER_H_ 3 | 4 | void heartbeat_server(int fd, int sec, int max); 5 | 6 | #endif 7 | -------------------------------------------------------------------------------- /UNP/24 带外数据/习题.md: -------------------------------------------------------------------------------- 1 | #### 24.1 在如下单个函数调用 2 | 3 | ~~~C 4 | send(fd, "ab", 2, MSG_OOB) 5 | ~~~ 6 | 7 | 和如下两个函数调用 8 | 9 | ~~~C 10 | send(fd, "a", 1, MSG_OOB) 11 | send(fd, "b, 1, MSG_OOB) 12 | ~~~ 13 | 14 | 之间存在差异吗? 15 | 16 | * 有区别,第一个发送单个 TCP 分组,该分组的 URG 位被置为 1,同时紧急指针指向 b 后面那个字节 17 | * 第二个例子,先发送 1 个 TCP 分组,紧急指针指向 a 后面那个字节,然后再发送 1 个 TCP 分组,紧急指针指向 b 后面那个字节。 18 | 19 | #### 24.2 重新编写图 24-6 中的程序,改用 poll 代替 select。 20 | 21 | * [`Practise_02_server.c`](https://github.com/YangXiaoHei/Networking/blob/master/UNP/24%20带外数据/progs/Practise_02_server.c) 22 | * 在 linux 上启动服务器,只有设置 POLLPRI 才能收到 OOB 数据,这与 UNP 书上说的设置 POLLRDBAND 不符合。 -------------------------------------------------------------------------------- /UNP/25 信号驱动式 IO/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/25 信号驱动式 IO/README.md -------------------------------------------------------------------------------- /UNP/25 信号驱动式 IO/progs/udp_echo_driven_by_sigio.h: -------------------------------------------------------------------------------- 1 | #ifndef _UDP_ECHO_DRIVEN_BY_SIG_IO_ 2 | #define _UDP_ECHO_DRIVEN_BY_SIG_IO_ 3 | 4 | void dg_echo(int fd, struct sockaddr *cliaddr, socklen_t len); 5 | 6 | #endif 7 | -------------------------------------------------------------------------------- /UNP/25 信号驱动式 IO/习题.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/25 信号驱动式 IO/习题.md -------------------------------------------------------------------------------- /UNP/26 线程/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/26 线程/README.md -------------------------------------------------------------------------------- /UNP/26 线程/progs/CreateData.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | int main(int argc, char const *argv[]) 10 | { 11 | int bytes = 100 << 10; /* 3M */ 12 | if (argc == 2) 13 | bytes = atoi(argv[1]) << 10; 14 | 15 | if (access("data", F_OK) == 0) 16 | remove("data"); 17 | 18 | srand((unsigned int)time(NULL)); 19 | int fd = open("data", O_RDWR | O_CREAT, 0644); 20 | const char *msg = "abcdefghijklmnopqrstuvwxyz"; 21 | for (int i = 0; i < bytes; i++) { 22 | int ridx = rand() % strlen(msg); 23 | write(fd, &msg[ridx], 1); 24 | } 25 | return 0; 26 | } 27 | -------------------------------------------------------------------------------- /UNP/26 线程/progs/IncorrectOfMultiThreadIncreaseStaticVar.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #define NLOOP 5000 11 | 12 | static int counter; 13 | 14 | void *increase(void *arg) 15 | { 16 | int index = (int)arg; 17 | int var; 18 | for (int i = 0; i < NLOOP; i++) { 19 | var = counter; 20 | printf("%ld : %d\n", index, var + 1); 21 | counter = var + 1; 22 | } 23 | } 24 | 25 | int main(int argc, char *argv[]) 26 | { 27 | int error = 0; 28 | pthread_t tidA, tidB; 29 | int i = 1, j = 2; 30 | if ((error = pthread_create(&tidA, NULL, increase, i)) != 0) { 31 | errno = error; 32 | perror("pthread_create fail!"); 33 | exit(1); 34 | } 35 | 36 | if ((error = pthread_create(&tidB, NULL, increase, j)) != 0) { 37 | errno = error; 38 | perror("pthread_create fail!"); 39 | exit(1); 40 | } 41 | 42 | pthread_join(tidA, NULL); 43 | pthread_join(tidB, NULL); 44 | } 45 | -------------------------------------------------------------------------------- /UNP/26 线程/progs/PthreadJoinTest.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | void *doit(void *arg) 7 | { 8 | int index = (int)arg; 9 | int ri = 10 - index; 10 | printf("thread %d sleep %d seconds\n", index, ri); 11 | sleep(ri); 12 | return (void *)NULL; 13 | } 14 | 15 | int main(int argc, char *argv[]) 16 | { 17 | pthread_t tid[10]; 18 | 19 | for (int i = 0; i < 10; i++) { 20 | pthread_create(tid + i, NULL, doit, i); 21 | } 22 | 23 | for (int i = 0; i < 10; i++) { 24 | printf("begin to join %d\n", i); 25 | pthread_join(tid[i], NULL); 26 | printf("end join %d\n", i); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /UNP/26 线程/progs/ReadWriteTool_safe.h: -------------------------------------------------------------------------------- 1 | #ifndef _READLINE_SAFE_H_ 2 | #define _READLINE_SAFE_H_ 3 | 4 | ssize_t readline(int fd, void *vptr, size_t len); 5 | ssize_t writen(int fd, void *vptr, ssize_t n); 6 | #endif 7 | -------------------------------------------------------------------------------- /UNP/26 线程/习题.md: -------------------------------------------------------------------------------- 1 | #### 26.1 假设同时服务 100 个客户,比较使用 fork 的一个服务器和使用线程的一个服务器所用的描述符量。 2 | 3 | * 都是 101 个套接字,多进程每个进程打开自己的描述符,主进程都会关闭连接描述符,所以主进程也只有一个监听套接字。 4 | * 使用线程的服务器在单个进程内打开着 101 个描述符 5 | 6 | #### 26.2 图 26.3 如果线程在 str_echo 返回之后不关闭各自的已连接套接字,将会发生什么? 7 | 8 | * str_echo 返回说明客户端发送了 FIN,那么服务器回传 ACK 后客户端停留在 `FIN_WAIT_2` 阶段,因为服务器不 close,所以客户端一直停留在 `FIN_WAIT_2` 阶段 9 | 10 | #### 26.3 在图 5-5 和图 6-13 中,当期待服务器回射某个文本行而收到的却是 EOF 时,客户就显示 "server terminated permaturely (服务器过早终止)" (回顾 5.12 节)。把图 26-2 改为也在合适的时候显示这条消息。 11 | 12 | * 只要判断 read 的返回值 <= 0就 OK。 13 | 14 | #### 26.4 把图 26-11 和图 26-12 改为能够在不支持线程的系统上编译通过。 15 | 16 | * 17 | 18 | #### 26.5 为了观察图 3-18 的 readline 函数版本用于图 26-3 的线程化程序时表现出来的错误,构造这个 TCP 回射服务器程序并启动运行。然后构造能够以批量方式正确工作的来自图 6-13 的 TCP 回射客户端。在自己的系统上找到一个冗长的文本文件,在批量方式下启动运行客户端 3 次,让它们从这个文本文件中读且把输出写到各自的临时文件中。要是可能,在不同于服务器所在主机的另一个主机上运行这些客户。如果这些客户正确滴终止(它们往往刮起),那就查看它们的临时输出文件,并和输入文件进行比较。现在构造一个使用来自 26.5 节的 readline 函数线程安全版本的 TCP 回射服务器程序。重新以 3 个客户运行上述测试:这回它们都应该工作。你还应该分别在 readline_destructor 函数和 readline_once 函数中以及 readline 中的 malloc 调用处放置一个 printf。由它们的输出可以证实键只被某个线程一次性创建,但是每个线程都各自分配了内存空间并调用了析构函数。 19 | 20 | -------------------------------------------------------------------------------- /UNP/28 原始套接字/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/28 原始套接字/README.md -------------------------------------------------------------------------------- /UNP/28 原始套接字/progs/FdTransmitTool.h: -------------------------------------------------------------------------------- 1 | #ifndef _FD_TRANSMIT_H_ 2 | #define _FD_TRANSMIT_H_ 3 | 4 | int write_fd(int unixfd, void *ptr, size_t len, int totransfd); 5 | int read_fd(int unixfd, void *buf, size_t buflen, int *recvfd); 6 | 7 | #endif 8 | -------------------------------------------------------------------------------- /UNP/28 原始套接字/progs/LookHowManyBytesOfStructICMP.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | int main(int argc, char *argv[]) 11 | { 12 | printf("%zd\n", sizeof(struct icmp)); 13 | } 14 | -------------------------------------------------------------------------------- /UNP/28 原始套接字/progs/SignBitExpendTest.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include "../../tool/bin_tool.h" 6 | 7 | int main(int argc, char *argv[]) 8 | { 9 | unsigned int value = 0xFFFFFF; 10 | unsigned short *w = &value; 11 | w++; 12 | unsigned short sum = 0; 13 | sum = *(char *)w; 14 | printf("%s\n", u16ToBinaryString(sum, eight)); 15 | 16 | unsigned int h = 65535 + 65535; 17 | printf("%s\n", u32ToBinaryString(h, eight)); 18 | } 19 | -------------------------------------------------------------------------------- /UNP/28 原始套接字/progs/comm.h: -------------------------------------------------------------------------------- 1 | #ifndef _COMM_H_ 2 | #define _COMM_H_ 3 | 4 | struct icmpd_err { 5 | int icmpd_errno; 6 | char icmpd_type; 7 | char icmpd_code; 8 | socklen_t icmpd_len; 9 | struct sockaddr_storage icmpd_dst; 10 | }; 11 | 12 | #endif 13 | -------------------------------------------------------------------------------- /UNP/28 原始套接字/习题.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/28 原始套接字/习题.md -------------------------------------------------------------------------------- /UNP/29 数据链路访问/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/29 数据链路访问/README.md -------------------------------------------------------------------------------- /UNP/29 数据链路访问/习题.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/29 数据链路访问/习题.md -------------------------------------------------------------------------------- /UNP/30 客户服务器程序设计范式/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/30 客户服务器程序设计范式/README.md -------------------------------------------------------------------------------- /UNP/30 客户服务器程序设计范式/progs/AddrTool.h: -------------------------------------------------------------------------------- 1 | #ifndef _ADDR_TOOL_H 2 | #define _ADDR_TOOL_H 3 | 4 | #include 5 | char *getAddrInfo(struct sockaddr *addr); 6 | char *getPeerInfo(int fd); 7 | char *getSockInfo(int fd); 8 | 9 | /* 静态内存 */ 10 | const char * getMaskInfo(struct sockaddr *sa); 11 | 12 | #endif -------------------------------------------------------------------------------- /UNP/30 客户服务器程序设计范式/progs/CPUTimeTest.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "../../tool/TimeTool.h" 3 | #include 4 | #include 5 | #include 6 | 7 | int main(int argc, char *argv[]) 8 | { 9 | int fd = open("haha", O_CREAT | O_APPEND | O_RDWR, 0644); 10 | 11 | int n = 2; 12 | for (int i = 0; i < 100000; i++) { 13 | n *= n; 14 | write(fd, &n, sizeof(int)); 15 | write(fd, &n, sizeof(int)); 16 | write(fd, &n, sizeof(int)); 17 | write(fd, &n, sizeof(int)); 18 | } 19 | cpu_time(); 20 | } 21 | -------------------------------------------------------------------------------- /UNP/30 客户服务器程序设计范式/progs/FdTransmitTool.h: -------------------------------------------------------------------------------- 1 | #ifndef _FD_TRANSMIT_H_ 2 | #define _FD_TRANSMIT_H_ 3 | 4 | int write_fd(int unixfd, void *ptr, size_t len, int totransfd); 5 | int read_fd(int unixfd, void *buf, size_t buflen, int *recvfd); 6 | 7 | #endif 8 | -------------------------------------------------------------------------------- /UNP/30 客户服务器程序设计范式/习题.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/30 客户服务器程序设计范式/习题.md -------------------------------------------------------------------------------- /UNP/99 epoll 补充/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/99 epoll 补充/README.md -------------------------------------------------------------------------------- /UNP/99 epoll 补充/习题.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/99 epoll 补充/习题.md -------------------------------------------------------------------------------- /UNP/review/TCPPerformanceTestClient.c: -------------------------------------------------------------------------------- 1 | 2 | #define DATALEN (3 << 20) 3 | char data[DATALEN]; 4 | 5 | int main(int argc, char *argv[]) 6 | { 7 | if (argc != 6) { 8 | logx("usage : %s ", argv[0]); 9 | exit(1); 10 | } 11 | 12 | int nchild = atoi(argv[3]); 13 | int nbytes = atoi(argv[5]); 14 | int nloop = atoi(argv[4]); 15 | 16 | pid_t pid; 17 | for (int i = 0; i < nchild; i++) { 18 | if ((pid = fork()) < 0) { 19 | logx("fork error!"); 20 | exit(1); 21 | } else if (pid == 0) { 22 | int fd = -1; 23 | if ((fd = tcp_connect(argv[1], argv[2])) < 0) { 24 | logx("tcp_connect error!"); 25 | exit(1); 26 | } 27 | for (int j = 0; j < nloop; j++) { 28 | 29 | } 30 | } 31 | 32 | } 33 | 34 | 35 | } 36 | 37 | -------------------------------------------------------------------------------- /UNP/review/create_file: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/review/create_file -------------------------------------------------------------------------------- /UNP/review/icmp_daemon: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/UNP/review/icmp_daemon -------------------------------------------------------------------------------- /UNP/review/test.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | 7 | int main(int argc, char *argv[]) 8 | { 9 | printf("%d\n", errno); 10 | sleep(1); 11 | printf("%d\n", errno); 12 | } 13 | -------------------------------------------------------------------------------- /UNP/review/udp_client_test.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include "../tool/CommonTool.h" 7 | 8 | int main(int argc, char *argv[]) 9 | { 10 | int fd = -1; 11 | if ((fd = udp_connect(argv[1], argv[2])) < 0) { 12 | perror("tcp_connect error!"); 13 | exit(1); 14 | } 15 | char buf[1024]; 16 | sendto(fd, "1234", 4, 0, NULL, 0); 17 | struct sockaddr_in svraddr; 18 | socklen_t clilen = sizeof(svraddr); 19 | recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr *)&svraddr, &clilen); 20 | 21 | printf("%s %d\n", inet_ntoa(svraddr.sin_addr), ntohs(svraddr.sin_port)); 22 | } 23 | -------------------------------------------------------------------------------- /UNP/review/udp_server_test.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "../tool/CommonTool.h" 8 | 9 | int main(int argc, char *argv[]) 10 | { 11 | int fd = -1; 12 | if ((fd = udp_server(argv[1])) < 0) { 13 | perror("udp_server error!"); 14 | exit(1); 15 | } 16 | char buf[1024]; 17 | struct sockaddr_in cliaddr; 18 | socklen_t clilen = sizeof(cliaddr); 19 | ssize_t nread = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr *)&cliaddr, &clilen); 20 | sendto(fd, buf, nread, 0, (struct sockaddr *)&cliaddr, clilen); 21 | } 22 | -------------------------------------------------------------------------------- /UNP/tool/AddrTool.h: -------------------------------------------------------------------------------- 1 | #ifndef _ADDR_TOOL_H 2 | #define _ADDR_TOOL_H 3 | 4 | #include 5 | char *getAddrInfo(struct sockaddr *addr); 6 | char *getPeerInfo(int fd); 7 | char *getSockInfo(int fd); 8 | 9 | /* 静态内存 */ 10 | const char * getMaskInfo(struct sockaddr *sa); 11 | 12 | #endif -------------------------------------------------------------------------------- /UNP/tool/CommonTool.h: -------------------------------------------------------------------------------- 1 | #ifndef _COMMON_TOOL_H_ 2 | #define _COMMON_TOOL_H_ 3 | 4 | typedef void(*sig_handler)(int); 5 | 6 | sig_handler fuck(int signo, sig_handler newhandler); 7 | sig_handler fuck_int(int signo, sig_handler newhandler); 8 | 9 | int tcp_connect_cb(const char *hostname, const char *service, int(*cb)(int)); 10 | int tcp_connect(const char *hostname, const char *service); 11 | int tcp_server(const char *service); 12 | int tcp_server_cb(const char *service, int(*cb)(int)); 13 | int udp_connect(const char *hostname, const char *service); 14 | int udp_connect_cb(const char *hostname, const char *service, int(*cb)(int)); 15 | int udp_server(const char *service); 16 | int udp_server_cb(const char *service, int(*cb)(int)); 17 | 18 | #endif 19 | -------------------------------------------------------------------------------- /UNP/tool/FdTransmitTool.h: -------------------------------------------------------------------------------- 1 | #ifndef _FD_TRANSMIT_H_ 2 | #define _FD_TRANSMIT_H_ 3 | 4 | int write_fd(int unixfd, void *ptr, size_t len, int totransfd); 5 | int read_fd(int unixfd, void *buf, size_t buflen, int *recvfd); 6 | 7 | #endif 8 | -------------------------------------------------------------------------------- /UNP/tool/PathTool.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | static char absloutePath[1024]; 7 | 8 | char *getAbsolutePath(const char *argv0) 9 | { 10 | char buf[1024]; 11 | getcwd(buf, sizeof(buf)); 12 | snprintf(absloutePath, 1024, "%s/%s", buf, argv0); 13 | return absloutePath; 14 | } 15 | -------------------------------------------------------------------------------- /UNP/tool/PathTool.h: -------------------------------------------------------------------------------- 1 | #ifndef _PATH_TOOL_H_ 2 | #define _PATH_TOOL_H_ 3 | 4 | char *getAbsolutePath(const char *argv0); 5 | 6 | #endif -------------------------------------------------------------------------------- /UNP/tool/ReadWriteTool.h: -------------------------------------------------------------------------------- 1 | #ifndef READ_WRITE_TOOL_H 2 | #define READ_WRITE_TOOL_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | ssize_t readn(int fd, char *buf, ssize_t n); 10 | ssize_t readline(int fd, char *buf, size_t buflen); 11 | ssize_t writen(int fd, void *vptr, ssize_t n); 12 | 13 | #endif 14 | -------------------------------------------------------------------------------- /UNP/tool/ReadWriteTool_safe.h: -------------------------------------------------------------------------------- 1 | #ifndef _READLINE_SAFE_H_ 2 | #define _READLINE_SAFE_H_ 3 | 4 | ssize_t readline(int fd, void *vptr, size_t len); 5 | ssize_t writen(int fd, void *vptr, ssize_t n); 6 | #endif 7 | -------------------------------------------------------------------------------- /UNP/tool/TimeTool.h: -------------------------------------------------------------------------------- 1 | #ifndef _TIME_TOOL_H 2 | #define _TIME_TOOL_H 3 | 4 | #define mlogx(fmt, ...) _mlogx(__FILE__, __LINE__, fmt, ##__VA_ARGS__) 5 | 6 | void cpu_time(void); 7 | const char *curtimestr(); 8 | unsigned long curtimeus(); 9 | char *tcpdump_timestamp(void); 10 | ssize_t logx(const char *fmt, ...); 11 | 12 | ssize_t _mlogx(const char *file, int line, const char *fmt, ...); 13 | 14 | #endif 15 | -------------------------------------------------------------------------------- /UNP/tool/test.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "CommonTool.h" 4 | 5 | int cb(int fd) 6 | { 7 | return 0; 8 | } 9 | 10 | int main(int argc, char *argv[]) 11 | { 12 | if (argc != 3) { 13 | printf("usage : %s \n", argv[0]); 14 | exit(1); 15 | } 16 | int fd = -1; 17 | fd = tcp_connect(argv[1], argv[2]); 18 | fd = tcp_server(argv[2]); 19 | fd = udp_connect(argv[1], argv[2]); 20 | fd = udp_server(argv[2]); 21 | 22 | fd = tcp_connect_cb(argv[1], argv[2], cb); 23 | fd = udp_connect_cb(argv[1], argv[2], cb); 24 | 25 | fd = udp_server_cb(argv[2], cb); 26 | fd = tcp_server_cb(argv[2], cb); 27 | 28 | return 0; 29 | } 30 | -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/01 计算机网络和因特网.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/01 计算机网络和因特网.xmind -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/mistake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/mistake.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/p10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/p10.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/p14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/p14.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/p17.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/p17.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/p17.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/p17.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/p4.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/p4.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/p4.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/p4.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/p4.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/p4.3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/r16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/r16.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/r4.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/r4.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/r4.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/r4.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/r4.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/r4.3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/r4.4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/r4.4.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/r4.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/r4.5.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/r4.6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/r4.6.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/wireshake_dns.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/wireshake_dns.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/wireshake_http.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/wireshake_http.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/wireshake_icmp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/wireshake_icmp.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/wireshake_tcp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/wireshake_tcp.png -------------------------------------------------------------------------------- /计算机网络自顶向下/01 计算机网络和因特网/images/wireshake_time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/01 计算机网络和因特网/images/wireshake_time.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/02 应用层.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/02 应用层.xmind -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/p18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/p18.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/p19.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/p19.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/p19.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/p19.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/p19.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/p19.3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/p19.4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/p19.4.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/p19.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/p19.5.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/p22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/p22.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/p24.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/p24.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/p24.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/p24.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/p27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/p27.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/p7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/p7.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/p9.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/p9.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl10.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl11.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl12.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl13.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl14.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl15.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl16.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl17.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl18.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl4.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl5.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl6.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl7.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl8.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wl9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wl9.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns10.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns11.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns12.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns13.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns13.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns13.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns14.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns15.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns16.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns17.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns18.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns19.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns20.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns21.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns4.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns5.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns5.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns5.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns6.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns7.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns8.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/images/wldns9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/images/wldns9.png -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/progs/iPhoneTCPClient/iPhoneTCPClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/progs/iPhoneTCPClient/iPhoneTCPClient.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/progs/iPhoneTCPClient/iPhoneTCPClient.xcodeproj/project.xcworkspace/xcuserdata/YangHan.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/02 应用层/progs/iPhoneTCPClient/iPhoneTCPClient.xcodeproj/project.xcworkspace/xcuserdata/YangHan.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/progs/iPhoneTCPClient/iPhoneTCPClient.xcodeproj/xcuserdata/YangHan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/progs/iPhoneTCPClient/iPhoneTCPClient.xcodeproj/xcuserdata/YangHan.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | iPhoneTCPClient.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/progs/iPhoneTCPClient/iPhoneTCPClient/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // iPhoneTCPClient 4 | // 5 | // Created by YangHan on 2018/9/12. 6 | // Copyright © 2018年 YangHan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/progs/iPhoneTCPClient/iPhoneTCPClient/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/progs/iPhoneTCPClient/iPhoneTCPClient/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // iPhoneTCPClient 4 | // 5 | // Created by YangHan on 2018/9/12. 6 | // Copyright © 2018年 YangHan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/progs/iPhoneTCPClient/iPhoneTCPClient/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // iPhoneTCPClient 4 | // 5 | // Created by YangHan on 2018/9/12. 6 | // Copyright © 2018年 YangHan. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/progs/iPhoneTCPClient/iPhoneTCPClientTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/progs/iPhoneTCPClient/iPhoneTCPClientTests/iPhoneTCPClientTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // iPhoneTCPClientTests.m 3 | // iPhoneTCPClientTests 4 | // 5 | // Created by YangHan on 2018/9/12. 6 | // Copyright © 2018年 YangHan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface iPhoneTCPClientTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation iPhoneTCPClientTests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | // Put setup code here. This method is called before the invocation of each test method in the class. 20 | } 21 | 22 | - (void)tearDown { 23 | // Put teardown code here. This method is called after the invocation of each test method in the class. 24 | [super tearDown]; 25 | } 26 | 27 | - (void)testExample { 28 | // This is an example of a functional test case. 29 | // Use XCTAssert and related functions to verify your tests produce the correct results. 30 | } 31 | 32 | - (void)testPerformanceExample { 33 | // This is an example of a performance test case. 34 | [self measureBlock:^{ 35 | // Put the code you want to measure the time of here. 36 | }]; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/progs/iPhoneTCPClient/iPhoneTCPClientUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/progs/rm_exec.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | for file in `find . -type f -print` 4 | do 5 | if [ -x $file ] && [[ "`basename $file`" != "`basename $0`" ]] 6 | then 7 | rm $file 8 | fi 9 | done 10 | -------------------------------------------------------------------------------- /计算机网络自顶向下/02 应用层/resource/index.html: -------------------------------------------------------------------------------- 1 | hahahahaha 2 | -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/AIMD_graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/AIMD_graph.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/GBN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/GBN.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/Interesting_case.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/Interesting_case.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/Stop_And_Wait_prog_design.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/Stop_And_Wait_prog_design.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/TCP_congestion_control_alg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/TCP_congestion_control_alg.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/TCP_fairness.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/TCP_fairness.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/TCP_four_handshake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/TCP_four_handshake.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/TCP_segment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/TCP_segment.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/TCP_three_handshake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/TCP_three_handshake.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/Telnet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/Telnet.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/UDP_segment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/UDP_segment.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/nEstimatedRTT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/nEstimatedRTT.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p10.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p10.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p10.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p10.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p13.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p17.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p18.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p18.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p18.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p18.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p18.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p18.3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p19.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p20.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p21.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p22.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p22.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p22.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p22.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p22.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p23.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p27.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p3.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p3.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p32.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p33.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p36.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p4.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p4.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p4.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p4.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p40.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p41.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p45.a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p45.a.jpg -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p45.b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p45.b.jpg -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p49.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p49.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p49.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p49.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p49.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p49.3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p49.4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p49.4.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p50.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p51.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p56.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p56.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p56.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p56.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p56.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p56.3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p6.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p8.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/p9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/p9.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/question.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/question.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/r10.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/r10.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/r13.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/r13.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/r13.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/r13.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/r13.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/r13.3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/r16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/r16.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/r17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/r17.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/r19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/r19.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/r9.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/r9.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/r9.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/r9.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/rdt_1_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/rdt_1_0.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/rdt_2_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/rdt_2_0.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/rdt_2_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/rdt_2_1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/rdt_2_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/rdt_2_2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/rdt_3_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/rdt_3_0.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/sr_dilemma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/sr_dilemma.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/stop_wait_vs_pipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/stop_wait_vs_pipeline.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/tcp_sendbuf_recvbuf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/tcp_sendbuf_recvbuf.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_tcp.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_tcp.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_tcp.10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_tcp.10.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_tcp.11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_tcp.11.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_tcp.12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_tcp.12.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_tcp.13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_tcp.13.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_tcp.14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_tcp.14.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_tcp.15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_tcp.15.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_tcp.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_tcp.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_tcp.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_tcp.3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_tcp.4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_tcp.4.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_tcp.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_tcp.5.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_tcp.6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_tcp.6.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_tcp.7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_tcp.7.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_tcp.8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_tcp.8.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_tcp.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_tcp.9.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_udp.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_udp.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_udp.10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_udp.10.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_udp.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_udp.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_udp.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_udp.3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_udp.4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_udp.4.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_udp.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_udp.5.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_udp.6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_udp.6.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_udp.7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_udp.7.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_udp.8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_udp.8.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/images/wl_udp.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/images/wl_udp.9.png -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/GBN/README.md: -------------------------------------------------------------------------------- 1 | ### `GBN` 实现 2 | 3 | * `GBN ` 设计 4 | * ![](https://github.com/YangXiaoHei/Networking/blob/master/03%20运输层/images/Stop_And_Wait_prog_design.png) 5 | 6 | * 该 `GBN ` 协议运行于应用层,在应用层中通过设定概率产生的比特差错和丢包事件来模拟一条不可靠信道。然后基于该不可靠信道,实现 `GBN ` 协议。 -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/GBN/TCP.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef TCP_LEVEL_H 3 | #define TCP_LEVEL_H 4 | 5 | int TCP_service_init(unsigned short bind_port); 6 | int TCP_connect(const char *peer_ip, unsigned short peer_port); 7 | int TCP_close(int fd); 8 | ssize_t TCP_recv(int fd, char *recv_buf, ssize_t maxlen); 9 | ssize_t TCP_send(int fd, const char *send_buf, ssize_t send_buf_len); 10 | 11 | #endif /* TCP_LEVEL_H */ -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/GBN/comm.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef _COMM_H_ 3 | #define _COMM_H_ 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include "log.h" 14 | #include "tool.h" 15 | #include "TCP.h" 16 | 17 | struct packet_t { 18 | unsigned char isACK; 19 | unsigned char isACKed; 20 | unsigned char isTransmited; 21 | unsigned short seq; 22 | unsigned short checksum; 23 | unsigned long timeout_timestamp; 24 | char data[8]; 25 | }; 26 | 27 | #define SENDER_WIN_SZ 4 28 | #define TIMEOUT_INTERVAL 3000000 29 | 30 | #endif -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/GBN/log.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef LOG_H 3 | #define LOG_H 4 | 5 | ssize_t YHLog(const char *file, int line, const char *fun, const char *format, ...); 6 | ssize_t YHLog_err(const char *file, int line, const char *fun, const char *format, ...); 7 | 8 | #define LOG(_format_, ...) YHLog(__FILE__, __LINE__, __FUNCTION__, _format_, ##__VA_ARGS__) 9 | #define ERRLOG(_format_, ...) YHLog_err(__FILE__, __LINE__, __FUNCTION__, _format_, ##__VA_ARGS__) 10 | 11 | #endif 12 | -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/GBN/receiver: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/progs/GBN/receiver -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/GBN/run_receiver.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | cc tool.c TCP.c receiver.c log.c -o receiver && ./receiver 5000 4 | -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/GBN/run_sender.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | cc tool.c TCP.c sender.c log.c -o sender && ./sender 127.0.0.1 5000 4 | -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/GBN/sender: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/progs/GBN/sender -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/GBN/tool.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef _TOOL_H_ 3 | #define _TOOL_H_ 4 | 5 | void init_rand(void); 6 | int min(int a, int b); 7 | char *to_bin(unsigned long num); 8 | int yh_random(int n, int m); 9 | int probability(double pro); 10 | void gen_one_bit_error(char *msg, size_t msg_len); 11 | void clrflags(int fd, int flag); 12 | void setflags(int fd, int flag); 13 | unsigned long curtime_us(void); 14 | short _calculate_checksum(short num1, short num2); 15 | short calculate_checksum(char *data, size_t datalen); 16 | 17 | #endif 18 | -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/Stop_And_Wait/README.md: -------------------------------------------------------------------------------- 1 | ### `Stop_And_Wait` 实现 2 | 3 | * `Stop_And_Wait` 设计 4 | * ![](https://github.com/YangXiaoHei/Networking/blob/master/03%20运输层/images/Stop_And_Wait_prog_design.png) 5 | 6 | * 该 `Stop_And_Wait` 协议运行于应用层,在应用层中通过设定概率产生的比特差错和丢包事件来模拟一条不可靠信道。然后基于该不可靠信道,实现 `Stop_And_Wait` 协议。 -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/Stop_And_Wait/TCP.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef TCP_LEVEL_H 3 | #define TCP_LEVEL_H 4 | 5 | int TCP_service_init(unsigned short bind_port); 6 | int TCP_connect(const char *peer_ip, unsigned short peer_port); 7 | int TCP_close(int fd); 8 | ssize_t TCP_recv(int fd, char *recv_buf, ssize_t maxlen); 9 | ssize_t TCP_send(int fd, const char *send_buf, ssize_t send_buf_len); 10 | 11 | #endif /* TCP_LEVEL_H */ -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/Stop_And_Wait/comm.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef _COMMON_H_ 3 | #define _COMMON_H_ 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include "log.h" 14 | #include "tool.h" 15 | #include "TCP.h" 16 | 17 | enum sender_state { 18 | sender_begin = 100, 19 | sender_wait_ACK_0, 20 | sender_wait_ACK_1, 21 | sender_wait_0, 22 | sender_wait_1, 23 | sender_end = 200 24 | }; 25 | 26 | enum receiver_state { 27 | receiver_begin = 300, 28 | receiver_state_wait_0, 29 | receiver_state_wait_1, 30 | receiver_end = 400 31 | }; 32 | 33 | struct packet_t { 34 | unsigned short seq; 35 | unsigned short checksum; 36 | unsigned short isACK; 37 | char data[8]; 38 | }; 39 | 40 | #define TIMEOUT_INTERVAL (3000000) 41 | 42 | #endif 43 | -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/Stop_And_Wait/log.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef LOG_H 3 | #define LOG_H 4 | 5 | ssize_t YHLog(const char *file, int line, const char *fun, const char *format, ...); 6 | ssize_t YHLog_err(const char *file, int line, const char *fun, const char *format, ...); 7 | 8 | #define LOG(_format_, ...) YHLog(__FILE__, __LINE__, __FUNCTION__, _format_, ##__VA_ARGS__) 9 | #define ERRLOG(_format_, ...) YHLog_err(__FILE__, __LINE__, __FUNCTION__, _format_, ##__VA_ARGS__) 10 | 11 | #endif 12 | -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/Stop_And_Wait/receiver: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/progs/Stop_And_Wait/receiver -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/Stop_And_Wait/run_receiver.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | cc tool.c TCP.c receiver.c log.c -o receiver && ./receiver 5000 4 | -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/Stop_And_Wait/run_sender.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | cc tool.c TCP.c sender.c log.c -o sender && ./sender 127.0.0.1 5000 4 | -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/Stop_And_Wait/sender: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/03 运输层/progs/Stop_And_Wait/sender -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/Stop_And_Wait/test.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "tool.h" 5 | #include "log.h" 6 | 7 | int main(int argc, char const *argv[]) 8 | { 9 | char msg[8]; 10 | msg[0] = 0x23; 11 | msg[1] = 0xC5; 12 | 13 | msg[2] = 0x67; 14 | msg[3] = 0x89; 15 | 16 | msg[4] = 0x44; 17 | msg[5] = 0x96; 18 | 19 | msg[6] = 0x78; 20 | msg[7] = 0x98; 21 | 22 | // 1100 0101 0010 0011 23 | // 1000 1001 0110 0111 24 | // -------------------- 25 | // 0100 1110 1000 1011 26 | 27 | // 0100 1110 1000 1011 28 | // 1001 0110 0100 0100 29 | // ------------------- 30 | // 1110 0100 1100 1111 31 | 32 | // 1110 0100 1100 1111 33 | // 1001 1000 0111 1000 34 | // ------------------- 35 | // 0111 1101 0100 1000 36 | 37 | short res1 = calculate_checksum(msg, sizeof(msg)); 38 | LOG("%s", to_bin(res1)); 39 | 40 | // 1000 0010 1011 0111 41 | 42 | return 0; 43 | } -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/progs/Stop_And_Wait/tool.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef _TOOL_H_ 3 | #define _TOOL_H_ 4 | 5 | void init_rand(void); 6 | char *to_bin(unsigned long num); 7 | int yh_random(int n, int m); 8 | int probability(double pro); 9 | void gen_one_bit_error(char *msg, size_t msg_len); 10 | void clrflags(int fd, int flag); 11 | void setflags(int fd, int flag); 12 | unsigned long curtime_us(void); 13 | short _calculate_checksum(short num1, short num2); 14 | short calculate_checksum(char *data, size_t datalen); 15 | 16 | #endif 17 | -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/习题_01_02.md: -------------------------------------------------------------------------------- 1 | #### P1. 假设客户 A 向服务器 S 发起一个 Telnet 会话。与此同时,客户 B 也向服务器 S 发起一个 Telnet 会话。给出下面报文段的源端口号和目的端口号: 2 | #### a. 从 A 向 S 发送的报文段。 3 | #### b. 从 B 向 S 发送的报文段。 4 | #### c. 从 S 向 A 发送的报文段。 5 | #### d. 从 S 向 B 发送的报文段。 6 | #### e. 如果 A 和 B 是不同的主机,那么从 A 向 S 发送的报文段的源端口号是否可能与从 B 向 S 发送的报文段的源端口号相同? 7 | #### f. 如果它们是同一台主机,情况会怎么样? 8 | 9 | > 假设 A 的源端口号是 a, B 的源端口号是 b。 10 | > 11 | > a. 12 | > 13 | > 从 A 向 S 发送的报文段:(a, 23) 14 | > 15 | > b. 16 | > 17 | > 从 B 向 S 发送的报文段:(b, 23) 18 | > 19 | > c. 20 | > 21 | > 从 S 向 A 发送的报文段:(23, a) 22 | > 23 | > d. 24 | > 25 | > 从 S 向 B 发送的报文段:(23, b) 26 | > 27 | > e. 28 | > 29 | > A, B 是不同主机的话, 那么 a 有可能等于 b,但是因为 TCP 套接字是根据四元组来标识的 `(dst_ip, dst_port, src_ip, src_port)`,而我们知道,主机 A 和 主机 B 的 IP 地址不会相同,因此相同端口号的报文段到达主机 S 仍然能被定位到不同的套接字中。 30 | > 31 | > f. 32 | > 33 | > 如果它们是同一台主机,那么源端口号不可能相同。 34 | 35 | #### P2. 考虑图 3-5。从服务器返回客户进程的报文流中的源端口号和目的端口号是多少?在承载运输层报文段的数据报中,IP 地址是多少? 36 | 37 | > 向主机 A 的返包中:(B, 80, A, 26145)、(B, 80, A, 7532) 38 | > 39 | > 向主机 C 的返包中:(B, 80, C, 26145) 40 | -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/习题_29&55.md: -------------------------------------------------------------------------------- 1 | #### P29. 在 3.5.6 节中讨论了 SYN cookie。 2 | #### a. 服务器在 SYNACK 中使用一个特殊的初始序号,这为什么是必要的。 3 | #### b. 假定某攻击者得知了一台目标主机使用了 SYN cookie。该攻击者能够通过直接向目标发送一个 ACK 分组创建半开或全开连接吗?为什么? 4 | #### c. 假设某攻击者收集了由服务器发送的大量初始序号。该攻击者通过发送具有初始序号的 ACK,能够引起服务器产生许多全开连接吗?为什么? 5 | 6 | > // TODO SYN cookie 洪泛攻击原理和防御 7 | > 8 | > a. 9 | > 10 | > 为了抵御 SYN 洪泛攻击,原理: [SYN 洪泛攻击抵御原理](https://blog.csdn.net/bigtree_3721/article/details/77619119) 11 | > 12 | > b. 13 | > 14 | > 不能,因为 SYN cookie 是通过保存在服务器端的密码算出来的,而攻击者不知道该密码,因此无法伪造接下来的 ACK 中的 seq。 15 | > 16 | > c. 17 | > 18 | > 不能,因为服务器计算 SYN cookie 时可以加入时间戳作为参数,那么该 SYN cookie 便具有时效性,即便你发送了具有初始序号的 ACK,这些 SYN cookie 也已经过期了。 19 | 20 | #### P55. 在这个习题中我们研究是否 UDP 或 TCP 提供了某种程序的端点鉴别。 21 | #### a. 考虑一台服务器接收到在一个 UDP 分组中的请求并对该请求进行响应(例如, 如由 DNS 服务器所做的那样)。如果一个具有 IP 地址 X 的客户用地址 Y 进行哄骗的话,服务器将向何处发送它的响应? 22 | #### b. 假定一台服务器接收到具有 IP 源地址 Y 的一个 SYN,在用 SYNACK 响应之后,接受一个具有 IP 源地址 Y 和正确确认号的 ACK。假设该服务器选择了一个随机初始序号并且没有 “中间人”,该服务器能够确定该客户的确位于 Y 吗?(并且不再某个其他哄骗 Y 的地址 X)。 23 | 24 | > a. 25 | > 26 | > 服务器将向 Y 发送它的响应 27 | > 28 | > b. 29 | > 30 | > 该服务器能够确定该客户的确位于 Y,因为服务器在 SYNACK 中使用了特殊的 cookie 序号,能将此序号加 1 作为确认号在一定时间内发过来的客户一定是的确位于 Y (假设没有中间人)。 -------------------------------------------------------------------------------- /计算机网络自顶向下/03 运输层/复习题_37.md: -------------------------------------------------------------------------------- 1 | ### 3.7 2 | 3 | #### R17 假设两条 TCP 连接存在于一个带宽为 R bps 的瓶颈链路上,它们都将发送一个很大的文件(以相同的方向经过瓶颈链路),并且两者是同时开始发送文件。那么 TCP 将为每条连接分配什么样的速率? 4 | 5 | > 6 | > 如下图所示 7 | > 8 | > ![](https://github.com/YangXiaoHei/Networking/blob/master/计算机网络自顶向下/03%20运输层/images/r17.png) 9 | > 10 | > 不管这两条 TCP 连接起时于何种状态,它们都将以相同的增长率增长(以 45 度角斜向上,平行于平等带宽共享线),直到两条 TCP 连接所占用的带宽之和超过瓶颈链路容量,此时发生丢包事件,如果是 3 个冗余 ACK 指示的丢包事件,那么两条 TCP 连接从拥塞避免状态进入快速恢复状态,以指数增长;若是超时指示的丢包事件,那么两条 TCP 连接都变为 1 MSS,并且吧 ssthresh 修改为拥塞窗口的一半,进入慢启动阶段以指数增长,无论它们起始于何种状态,最终都将收敛到沿着平等带宽共享线上下(平行于平等带宽共享线)波动。 11 | 12 | #### R18 是非判断题。考虑 TCP 的拥塞机制。当发送方定时器超时时,其 ssthresh 的值将被设置为原来值的一半。 13 | 14 | > 15 | > ❌ 16 | > 17 | > 发送方定时器超时时,ssthresh 被设置为当前拥塞窗口的一半。 18 | 19 | #### R19 在 3.7 节的 "TCP分岔" 讨论中,对于 TCP 分岔的响应时间,断言大约是 4 * RTTfe + RTTbe + 处理时间。评价该断言。 20 | 21 | > 如下图所示 22 | > 23 | > ![](https://github.com/YangXiaoHei/Networking/blob/master/计算机网络自顶向下/03%20运输层/images/r19.png) 24 | 25 | -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/AS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/AS.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/AS_BGP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/AS_BGP.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/BGP_NEXT_HOP: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/BGP_NEXT_HOP -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/BGP_check_loop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/BGP_check_loop.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/BGP_routing_strategy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/BGP_routing_strategy.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/DHCP_exchange_for_switching_wifi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/DHCP_exchange_for_switching_wifi.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/DHCP_interaction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/DHCP_interaction.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/DV_algorithms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/DV_algorithms.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/DV_algorithms_linkcost_decrease.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/DV_algorithms_linkcost_decrease.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/DV_algorithms_linkcost_decrease_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/DV_algorithms_linkcost_decrease_2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/DV_algorithms_linkcost_increase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/DV_algorithms_linkcost_increase.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/FIFO_scheduling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/FIFO_scheduling.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/HOL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/HOL.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/IPv4报文格式.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/IPv4报文格式.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/IPv6_segment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/IPv6_segment.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/Oscillations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/Oscillations.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/RIP_working.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/RIP_working.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/Router_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/Router_structure.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/Switching_3_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/Switching_3_structure.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/VC_number.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/VC_number.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/configure_AS_internal_forward_table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/configure_AS_internal_forward_table.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/loop_weighted_scheduling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/loop_weighted_scheduling.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/network_layer_outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/network_layer_outline.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p24.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p26.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p26.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p26.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p28.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p28.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p28.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p30.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p31.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p31.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p31.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p34.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p34.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p34.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p34.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p34.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p37.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p39.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p4.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p40.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p40.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p40.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p40.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p40.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p40.3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p43.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p44.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p45.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p45.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p45.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p46.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p47.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p48.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p48.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p48.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p49.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p49.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p49.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p49.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p49.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p5.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p50.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p50.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p50.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p51.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p52.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/p9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/p9.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/priority_scheduling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/priority_scheduling.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/r15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/r15.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_dhcp_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_dhcp_0.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_dhcp_000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_dhcp_000.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_dhcp_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_dhcp_1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_dhcp_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_dhcp_10.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_dhcp_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_dhcp_11.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_dhcp_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_dhcp_12.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_dhcp_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_dhcp_2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_dhcp_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_dhcp_3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_dhcp_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_dhcp_4.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_dhcp_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_dhcp_5.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_dhcp_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_dhcp_6.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_dhcp_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_dhcp_7.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_dhcp_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_dhcp_8.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_dhcp_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_dhcp_9.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_icmp_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_icmp_1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_icmp_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_icmp_2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_icmp_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_icmp_3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_icmp_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_icmp_4.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_icmp_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_icmp_5.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_ip_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_ip_1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_ip_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_ip_2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_ip_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_ip_3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_ip_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_ip_4.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_ip_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_ip_5.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_ip_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_ip_6.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_ip_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_ip_7.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/wl_nat_figure_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/wl_nat_figure_1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/images/分片和组装.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/images/分片和组装.png -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/progs/Algorithms/Array.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef _DYNAMICARRAY_H_ 3 | #define _DYNAMICARRAY_H_ 4 | 5 | struct Array { 6 | int capacity; 7 | int size; 8 | int *elem; 9 | }; 10 | 11 | struct Array * arrayInit(); 12 | int arrayIsFull(struct Array *arr); 13 | int arrayIsEmpty(struct Array *arr); 14 | int arrayGetSize(struct Array *arr); 15 | void arrayRelease(struct Array **arr); 16 | void arrayDisplay(struct Array *arr); 17 | int arrayContainsElement(struct Array *arr, int e); 18 | int arrayGetIndexOfElement(struct Array *arr, int e); 19 | int arrayGetElementAtIndex(struct Array *arr, int i); 20 | void arrayAddElement(struct Array *arr, int e); 21 | int arrayRemoveLastElement(struct Array *arr); 22 | int arrayRemoveFirstElement(struct Array *arr); 23 | int arrayRemoveElementAtIndex(struct Array *arr, int i); 24 | 25 | #endif -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/progs/Algorithms/BreadthFirstPath.h: -------------------------------------------------------------------------------- 1 | #ifndef _BREADTH_FIRST_PATH_H_ 2 | #define _BREADTH_FIRST_PATH_H_ 3 | 4 | #include "Graph.h" 5 | #include "Stack.h" 6 | 7 | struct BreadthFirstPath { 8 | struct edge_t **edgeTo; 9 | int **disTo; 10 | unsigned char **marked; 11 | struct G *g; 12 | }; 13 | 14 | struct BreadthFirstPath *breadthFirstPathInit(struct G *g); 15 | struct Stack * breadthFirstPathGetPathBetween(struct BreadthFirstPath *bfp, int v, int w); 16 | int breadthFirstPathHasPathBetween(struct BreadthFirstPath *bfp, int v, int w); 17 | int breadthFirstPathGetDiameter(struct BreadthFirstPath *bfp); 18 | struct Stack * breadthFirstPathGetPathOfDimeter(struct BreadthFirstPath *bfp); 19 | int breadthFirstPathGetDistanceBetween(struct BreadthFirstPath *bfp, int v, int w); 20 | void breadthFirstPathRelease(struct BreadthFirstPath **bfp); 21 | 22 | #endif -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/progs/Algorithms/Dijkstra.h: -------------------------------------------------------------------------------- 1 | #ifndef _DIJKSTRA_H_ 2 | #define _DIJKSTRA_H_ 3 | 4 | #include "Graph.h" 5 | #include "Stack.h" 6 | #include "tool.h" 7 | #include "log.h" 8 | #include "Array.h" 9 | 10 | struct DijkstraSP { 11 | double *disTo; 12 | struct edge_t *edgeTo; 13 | struct G *g; 14 | }; 15 | 16 | struct DijkstraSP *dijkstraInitWithEdgeWeightedGraph(struct G *g, int s); 17 | void dijkstraRelease(struct DijkstraSP **ssp); 18 | int dijkstraHasPathTo(struct DijkstraSP *sp, int v); 19 | struct Stack * dijkstraGetPathTo(struct DijkstraSP *sp, int v); 20 | double dijkstraGetDistanceTo(struct DijkstraSP *sp, int v); 21 | 22 | #endif -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/progs/Algorithms/DijkstraX.c: -------------------------------------------------------------------------------- 1 | 2 | // TODO -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/progs/Algorithms/DijkstraX.h: -------------------------------------------------------------------------------- 1 | #ifndef _DIJKSTRAX_H_ 2 | #define _DIJKSTRAX_H_ 3 | 4 | struct DijkstraSPX { 5 | double *disTo; 6 | struct edge_t *edgeTo; 7 | struct G *g; 8 | }; 9 | 10 | struct DijkstraSPX *dijkstraInitWithEdgeWeightedGraph(struct G *g, int s); 11 | void dijkstraRelease(struct DijkstraSPX **ssp); 12 | int dijkstraHasPathTo(struct DijkstraSPX *sp, int v); 13 | struct Stack * dijkstraGetPathTo(struct DijkstraSPX *sp, int v); 14 | double dijkstraGetDistanceTo(struct DijkstraSPX *sp, int v); 15 | 16 | #endif -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/progs/Algorithms/PrimMST.h: -------------------------------------------------------------------------------- 1 | #ifndef _PRIMMST_H_ 2 | #define _PRIMMST_H_ 3 | 4 | #include "Graph.h" 5 | #include "PriorityQueue.h" 6 | #include "log.h" 7 | 8 | struct PrimMST { 9 | struct edge_t *edgeTo; 10 | double *disTo; 11 | char *marked; 12 | double totalWeight; 13 | struct PriorityQueue *pq; 14 | struct G *g; 15 | }; 16 | 17 | struct PrimMST *primMSTInit(struct G *g); 18 | double primMSTGetWeight(struct PrimMST *mst); 19 | void primMSTDisplayAllEdges(struct PrimMST *mst); 20 | void primMSTDisplayAllEdgesByMapping(struct PrimMST *mst, unsigned char(*mapper)(int)); 21 | int primMSTGetAllEdgesCount(struct PrimMST *mst); 22 | void primMSTRelease(struct PrimMST **mst); 23 | 24 | #endif -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/progs/Algorithms/Stack.h: -------------------------------------------------------------------------------- 1 | #ifndef _STACK_H_ 2 | #define _STACK_H_ 3 | 4 | #include "Graph.h" 5 | 6 | struct stack_node_t { 7 | struct stack_node_t *next; 8 | struct edge_t edge; 9 | }; 10 | 11 | struct Stack { 12 | int size; 13 | struct stack_node_t *first; 14 | }; 15 | 16 | struct Stack * stackInit(); 17 | void stackRelease(struct Stack **s); 18 | int stackGetSize(struct Stack *s); 19 | struct edge_t * stackGetTop(struct Stack *s); 20 | void stackPush(struct Stack *s, struct edge_t *e); 21 | void stackPop(struct Stack *s); 22 | int stackIsEmpty(struct Stack *s); 23 | void stackDisplay(struct Stack *s); 24 | void stackDisplayWithMapping(struct Stack *s, unsigned char(*mapper)(int v)); 25 | 26 | #endif -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/progs/Algorithms/log.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef LOG_H 3 | #define LOG_H 4 | 5 | #include 6 | #include 7 | 8 | ssize_t logForDebug(const char *file, int line, const char *fun, const char *format, ...); 9 | ssize_t errLogForDebug(const char *file, int line, const char *fun, const char *format, ...); 10 | 11 | #define LOG(_format_, ...) logForDebug(__FILE__, __LINE__, __FUNCTION__, _format_, ##__VA_ARGS__) 12 | #define ERRLOG(_format_, ...) errLogForDebug(__FILE__, __LINE__, __FUNCTION__, _format_, ##__VA_ARGS__) 13 | 14 | #endif 15 | -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/progs/Algorithms/run.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | if [ $# -ne 1 ] 4 | then 5 | file="main.c" 6 | else 7 | file=$1 8 | fi 9 | 10 | dir="." 11 | 12 | output="test" 13 | 14 | cc ${dir}/PrimMST.c ${dir}/PriorityQueue.c ${dir}/BreadthFirstPath.c ${dir}/Array.c ${dir}/Stack.c ${dir}/Dijkstra.c ${dir}/tool.c ${dir}/Graph.c $file ${dir}/log.c -o "$output" && ./"$output" 15 | -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/progs/Algorithms/test: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/04 网络层/progs/Algorithms/test -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/progs/Algorithms/tool.c: -------------------------------------------------------------------------------- 1 | #include "tool.h" 2 | #include "log.h" 3 | 4 | int randomBetween(int v, int w) 5 | { 6 | if (v > w) { 7 | LOG("invalid argument : v=%d w=%d", v, w); 8 | return -1; 9 | } 10 | return rand() % (w - v) + v; 11 | } 12 | -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/progs/Algorithms/tool.h: -------------------------------------------------------------------------------- 1 | #ifndef _TOOL_H_ 2 | #define _TOOL_H_ 3 | 4 | int randomBetween(int v, int w); 5 | 6 | #endif -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/progs/run.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | if [ $# -ne 1 ] 4 | then 5 | echo "usage : $0 <#file_path>" 6 | exit 7 | fi 8 | 9 | file=$1 10 | 11 | dir="Algorithms" 12 | 13 | output="exec_$file" 14 | 15 | cc ${dir}/BreadthFirstPath.c ${dir}/PriorityQueue.c ${dir}/PrimMST.c ${dir}/Array.c ${dir}/Stack.c ${dir}/Dijkstra.c ${dir}/tool.c ${dir}/Graph.c $file ${dir}/log.c -o "${output}" && ./"${output}" 16 | 17 | 18 | -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/习题_07_09.md: -------------------------------------------------------------------------------- 1 | #### P7 假设两个分组在完全相同的时刻到达一台路由器的两个不同输入端口。同时假设在该路由器中没有其他分组。 2 | #### a. 假设这两个分组朝着不同的输出端口转发。当交换结构使用一条共享总线时,这两个分组能在相同时刻朝着交换结构转发吗? 3 | #### b. 假设这两个分组朝着两个不同的输出端口转发,当交换结构使用纵横式时,这两个分组可能在形同时刻通过交换结构转发吗? 4 | #### c. 假设这两个分组朝着相同的输出端口转发。当交换结构使用纵横方式时,这两个分组可能在相同时刻通过交换结构转发吗? 5 | 6 | * a. 7 | * 不能 8 | 9 | * b. 10 | * 能 11 | 12 | * c. 13 | * 不能 14 | 15 | #### P8 在 4.3 节中,我们注意到如果交换结构比输入线路速率快 n 倍,其最大的排队时延为 `(n - 1)D`。假设所有分组有相同长度,在相同时刻 n 个分组到达 n 个输入端口,同时所有 n 个分组要转发到不同的输出端口。对于内存,总线和纵横式交换结构,一个分组的最大时延是多少? 16 | 17 | * 内存 : `(n - 1)D` 18 | * 总线 : `(n - 1)D` 19 | * 纵横式 : `0` 20 | 21 | #### P9 考虑下列交换机。假设所有数据报具有相同长度,交换机以一种分时隙、同步的方式运行,在一个时隙中一个数据报能够从某输入端口传送到某输出端口。其交换结构是纵横式的,因此在一个时隙中至多一个数据报能够传送到一个给定输出端口,但在一个单一时隙中不同的输出端口能够接受到来自不同输入端口的数据报,从输入端口到它们的输出端口传送所示的分组,所需的时隙数量最少是多少?此时假定使用你所需要的任何输入排队调度方法(即此时没有 HOL 阻塞)。假定你才用你能够设计的最差情况下的调度方案,假定非空输入队列不会空闲,所需的时隙数量最大是多少? 22 | 23 | ![](https://github.com/YangXiaoHei/Networking/blob/master/计算机网络自顶向下/04%20网络层/images/p9.png) 24 | 25 | * 最少是 3,步骤如下 26 | * 第一个时隙 : X Y 27 | * 第二个时隙 : X Y 28 | * 第三个时隙 : Z 29 | 30 | * 最大也是 3,因为非空输入队列不会空闲,你不能懒着不转发包,因此假定是如下步骤 31 | * 第一个时隙 : X Y 32 | * 第二个时隙 : X Z (调度方案避免 HOL 阻塞) 33 | * 第三个时隙 : Y 34 | * 因此怎么搞都是 3 个时隙。 35 | -------------------------------------------------------------------------------- /计算机网络自顶向下/04 网络层/习题_19_20.md: -------------------------------------------------------------------------------- 1 | #### P19 考虑向具有 700 字节 MTU 的一条链路发送一个 2400 字节的数据报。假定初始数据报标有标示号 422。将会生成多少个分片?在生成相关分片的数据报中的各个字段中的值是多少? 2 | 3 | |片|字节|标示号|标志|片偏移| 4 | |:---:|:---:|:---:|:---:|:---:| 5 | |第 1 片|680|422|1 (表示后面还有)|offset = 0| 6 | |第 2 片|680|422|1|offset = 680| 7 | |第 3 片|680|422|1|offset = 1360| 8 | |第 4 片|360|422|0|offset = 2040| 9 | 10 | #### P20 假定在源主机和目的主机 B 之间的数据报被限制为 1500 字节(包括首部)。假设 IP 首部为 20 字节,要发送一个 5 MB组成的 MP3 需要多少个数据报?解释你的答案是如何计算的。 11 | 12 | * 即每个数据报中的数据长度为 1480,那么每个应用层数据的长度为 1460,因此总共有 `5000000 / 1460 = 3425` -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/5_1_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/5_1_5.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/DOCSIS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/DOCSIS.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/checksum_wrong_analyze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/checksum_wrong_analyze.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/ethernet_frame_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/ethernet_frame_structure.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/link_layer_imp_position.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/link_layer_imp_position.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p12.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p12.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p12.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p12.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p12.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p12.3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p14.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p14.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p14.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p14.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p14.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p18.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p20.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p20.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p20.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p22.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p23.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p26.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p28.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p29.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p32.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p32.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p32.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p32.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p32.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p33.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p33.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p33.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p5.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p8.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p8.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p8.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p8.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/p9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/p9.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/r12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/r12.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/r2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/r2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/wl_arp_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/wl_arp_1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/images/wl_arp_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/images/wl_arp_2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/progs/checksum.c: -------------------------------------------------------------------------------- 1 | unsigned short checksum(unsigned short *addr, int len) 2 | { 3 | unsigned int sum = 0; 4 | unsigned short anwser = 0; 5 | unsigned short *w = addr; 6 | 7 | /* 16 位累加,每次用掉两个字节 */ 8 | while(len > 1) { 9 | sum += *w++; 10 | len -= 2; 11 | } 12 | 13 | /* 如果 len 是奇数,那么把最后一个字节加上去 */ 14 | if (len == 1) { 15 | *(unsigned char *)&anwser = *(unsigned char *)w; 16 | sum += anwser; 17 | } 18 | 19 | /* 把高 16 位和低 16 位相加 */ 20 | sum = (sum >> 16) + (sum & 0xFFFF); 21 | 22 | /* 把进位加上来 */ 23 | sum += (sum >> 16); 24 | 25 | /* 取反码 */ 26 | anwser = ~sum; 27 | return anwser; 28 | } -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/progs/checksum.h: -------------------------------------------------------------------------------- 1 | #ifndef _CHECKSUM_H_ 2 | #define _CHECKSUM_H_ 3 | 4 | unsigned short checksum(unsigned short *addr, int len); 5 | 6 | #endif -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/progs/p4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/progs/p4 -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/progs/p4.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "checksum.h" 5 | #include "bin_tool.h" 6 | 7 | #define SWAP(_x_) (_x_ = ((_x_ << 8) & 0xFF00) | ((_x_ >> 8) & 0xFF)) 8 | 9 | int main(int argc, char const *argv[]) 10 | { 11 | // char data[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 12 | // char *data = "BCDEFGHIJK"; 13 | char *data = "bcdefghijk"; 14 | printAsciiString(data); 15 | unsigned short cks = checksum((unsigned short *)data, 10); 16 | SWAP(cks); 17 | printf("checksum is 【%d】\n", cks); 18 | printf("binary string of cks is 【%s】\n", u16ToBinaryString(cks, EN_GROUP_IN_EIGHTS)); 19 | return 0; 20 | } -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/progs/test: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/05 链路层/progs/test -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/progs/test.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "checksum.h" 5 | #include "bin_tool.h" 6 | 7 | #define SWAP(_x_) (_x_ = ((_x_ << 8) & 0xFF00) | ((_x_ >> 8) & 0xFF)) 8 | 9 | int main(int argc, char const *argv[]) 10 | { 11 | if (argc != 2) { 12 | printf("usage : %s <#msg>", argv[0]); 13 | exit(1); 14 | } 15 | 16 | printAsciiString(argv[1]); 17 | 18 | int len = strlen(argv[1]); 19 | unsigned short cks = checksum((unsigned short *)argv[1], len); 20 | SWAP(cks); 21 | printf("checksum of %s is 【%d】\n",argv[1], cks); 22 | printf("binary string of cks is 【%s】\n", u16ToBinaryString(cks, EN_GROUP_IN_EIGHTS)); 23 | 24 | return 0; 25 | } -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/习题_23_25.md: -------------------------------------------------------------------------------- 1 | #### P23 考虑图 5-15。假定所有链路都是 100 Mbps。在该网络中的 9 台主机和两台服务器之间,能够取得的最大总聚合吞吐量是多少?你能够假设任何主机或服务器向任何其他主机或服务器发送分组。为什么? 2 | 3 | ![](https://github.com/YangXiaoHei/Networking/blob/master/计算机网络自顶向下/05%20链路层/images/p23.png) 4 | * 都采用交换机,因此聚合吞吐量是交换机各接口之和,因此是 11 * 100 Mbps = 1100 Mbps 5 | 6 | #### P24 假定在图 5-15 中的 3 台连接各系的交换机用集线器来代替。所有链路是 100 Mbps。现在回答习题 23 中提出的问题。 7 | 8 | * 集线器是冲突域,因此使用集线器的聚合吞吐量只有 100 Mbps,因此总的聚合吞吐量为 500 Mbps 9 | 10 | #### P25 假定在图 5-15 中的所有交换机用集线器来代替。所有链路都是 100 Mbps。现在回答在习题 23 中提出的问题。 11 | 12 | * 总聚合吞吐量为 100 Mbps。 -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/习题_27.md: -------------------------------------------------------------------------------- 1 | #### P27 在这个习题中,我们探讨用于 IP 语音应用的小分组。小分组长度的一个主要缺点是链路带宽的较大比例被首部字节所消耗。基于此,假定分组是由 P 字节和 5 字节首部组成。 2 | #### a. 考虑直接发送一个数字编码语音源。假定该源以 128 kbps 的恒定速率进行编码。假定每个源向网络发送分组之前每个分组被完全填充。填充一个分组所需要的时间是分组化时延(packetization delay)。根据L,确定分组化时延(以毫秒计)。 3 | #### b. 大于 20 毫秒的分组化时延会导致一个明显的、令人不快的回音。对于 L = 1500 字节(大致对应于一个最大长度的以太网分组)和 L = 50 字节(对应于一个 ATM 信元),确定该分组化时延。 4 | #### c. 对 R = 622 Mbps 的链路速率以及 L = 1500 字节和 L = 50 字节,计算单台交换机的存储转发时延。 5 | #### d. 对使用小分组长度的优点进行评述。 6 | 7 | * a. 8 | * `分组化时延 = 8L/128 ms = L/16 ms` 9 | 10 | * b. 11 | * L = 1500 字节,则分组化时延为 93.75 ms 12 | * L = 50 字节,则分组化时延为 3.125 ms 13 | 14 | * c. 15 | * 存储转发时延为 `d_trans = (8L + 40) / 622 x 10^6 s` 16 | * 对于 L = 1500 字节,存储转发时延为 19.2 us 17 | * 对于 L = 50 字节,存储转发时延为 0.7 us 18 | 19 | * d. 20 | * 对于大分组和小分组,存储转发时延都很小,但是分组的大小对于分组化时延的影响很显著,因此使用小分组会极大的减少分组化时延的影响。 -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/习题_31.md: -------------------------------------------------------------------------------- 1 | #### P31 在这个习题中,你将把已经学习过的因特网协议的许多东西拼装在一起。假设你走进房间,与以太网连接,并下载一个 Web 页面。从打开 PC 电源到得到 Web 页面,发生的所有协议步骤是什么?假设当你给 PC 加电时,在 DNS 或浏览器缓存中什么也没有。(提示:步骤包括使用以太网、DHCP、ARP、DNS、TCP 和 HTTP 协议。)明确指出在这些步骤中你如何获得网关路由器的 IP 和 MAC 地址。 2 | 3 | -------------------------------------------------------------------------------- /计算机网络自顶向下/05 链路层/复习题_51_52.md: -------------------------------------------------------------------------------- 1 | #### R1 考虑在 5.1.1 节中的运输类比。如果一个乘客类比为一个数据报,什么类比于链路层帧? 2 | 3 | * 乘客类比为数据报的话,拿到火车票,飞机票,大巴车票的乘客相当于链路层帧。 4 | 5 | #### R2 如果在因特网中的所有链路都提供可靠的交付服务,TCP 可靠传输服务将是多余的吗?为什么? 6 | 7 | * ![](https://github.com/YangXiaoHei/Networking/blob/master/master/计算机网络自顶向下/05%20链路层/images/r2.png) 8 | * 从上图中可以看出,尽管链路层提供了可靠的交付服务,但是仍然会出现分组失序,分组丢失,分组被路由器丢弃的问题,所以仍然需要端到端的可靠交付服务。 9 | 10 | #### R3 链路层协议能够向网络层提供哪些可靠的服务?在这些链路层服务中,哪些在 IP 中有对应的服务?哪些在 TCP 中有对应的服务? 11 | 12 | * 成帧:其实就是封装分组的意思,添加首部字段成为该层的新分组,TCP 和 IP 都有对应服务。 13 | * 链路接入:无 14 | * 可靠交付:TCP 中有可靠交付 15 | * 差错检测:TCP 和 IP 中都有差错检测机制 16 | * 差错纠正:无 17 | 18 | -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/IPsec_packet_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/IPsec_packet_structure.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/application_gateway_filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/application_gateway_filter.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/p10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/p10.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/p11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/p11.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/p12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/p12.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/p15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/p15.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/p16.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/p16.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/p16.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/p16.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/p19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/p19.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/p26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/p26.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/p4.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/p4.1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/p4.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/p4.2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/p4.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/p4.3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/p9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/p9.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/stateful_packet_filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/stateful_packet_filter.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/traditional_packet_filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/traditional_packet_filter.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_1.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_2.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_3.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_4.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_5.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_6.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_7.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_8.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoHei/Networking/db8fda9013abb317749ecef5c5cc35100e907e3d/计算机网络自顶向下/08 计算机网络中的安全/image/wl_ssl_9.png -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/习题_10.md: -------------------------------------------------------------------------------- 1 | #### P10 假定 Alice 要与采用对称密钥密码体制的 Bob 使用一个会话密钥 Ks 通信。在 8.2 节中,我们知道了如何使用公开密钥密码从 Alice 向 Bob 分发该会话密钥。在本习题中,我们探讨不使用公开密钥而使用一个密钥分发中心(KDC)分发会话密钥的方法。KDC 是一个与每个注册用户共享独特的秘密对称密钥的服务器。对于 Alice 和 Bob 而言,Ka-kdc 和 Kb-kdc 表示了这些密钥。设计一个使用 KDC 向 Alice 和 Bob 分发 Ks 的方案。你的方案应当使用三种报文来分发会话密钥:一种从 Alice 到 KDC 的报文;一种从 KDC 到 Alice 的报文。最后一种是从 Alice 到 Bob 的报文。第一种报文为 Ka-kdc(A, B)。使用标记 Ka-kdc、Kb-kdc、S、A 和 B 回答下列问题。 2 | #### a. 第二种报文是什么? 3 | #### b. 第三种报文是什么? 4 | 5 | ![](https://github.com/YangXiaoHei/Networking/blob/master/master/计算机网络自顶向下/08%20计算机网络中的安全/image/p10.png) 6 | 7 | * a. 8 | * 第二种报文是 KDC 发给 A 的报文,用 A 月 KDC 之间的共享密钥 Ka-kdc 加密了 K 和 kb-kdc(A, K) 组合的包。 9 | 10 | * b. 11 | * 第三种报文是 kb-kdc(A, K),用来告知 B 是 A 要与他通信,并且把对话密钥交给他。 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/习题_11_12.md: -------------------------------------------------------------------------------- 1 | #### P11 计算一个不同于图 8-8 中的两个报文的第三个报文,使该报文具有与图 8-8 中的报文相同的校验和。 2 | * ![](https://github.com/YangXiaoHei/Networking/blob/master/计算机网络自顶向下/08%20计算机网络中的安全/image/p11.png) 3 | 4 | #### P12 假定 Alice 和 Bob 共享两个秘密密钥:一个鉴别密钥 S1 和一个对称加密密钥 S2。扩充图 8-9,使之提供完整性和机密性。 5 | 6 | * ![](https://github.com/YangXiaoHei/Networking/blob/master/计算机网络自顶向下/08%20计算机网络中的安全/image/p12.png) 7 | 8 | -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/习题_13.md: -------------------------------------------------------------------------------- 1 | #### P13 在 BitTorrent P2P 文件分发协议中(参见第 2 章),种子将文件分割成块,并且对等方彼此重分发这些块。不使用任何保护,一个攻击者能够容易地通过假冒善意的对等方并向洪流中的一些对等方发送假冒块来实施破坏。这些未被怀疑的对等方则重新向其他对等方发送这些假冒块,其他对等方则将再次向甚至更多的对等方重新分发这些假冒块。因此,对于 BitTorrent 来说,采用一种机制使对等方能验证一个块的完整性,从而使得假冒块无法分发,这是至关重要的。假设当对等方加入一个洪流时,它初始从一个完全受信任的源得到一个 .torrent 文件。描述允许对等方验证块完整性的一个简单的方案。 2 | 3 | * 把所有块的 MD5 或者 SHA1 都算好存在 .torrent 文件中,每收到一个块就计算 MD5 或 SHA1 然后与 .torrent 文件中的进行比较,如果一致,就是合法的包,如果不一致,就遭到了篡改或者损坏。 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/习题_14.md: -------------------------------------------------------------------------------- 1 | #### P14 OSPF 路由选择协议使用一个 MAC 而不是数字签名来提供报文完整性。你认为选择 MAC 而未选择数字签名的原因是什么? 2 | 3 | * 数字签名需要一个公钥基础设施来提供公钥认证,并且非对称加密的计算耗费 CPU 的性能,对于在同一个 AS 内运行的所有路由器来说,管理员能很容易的在路由器中配置所有路由器共享的鉴别密钥,因此不需要使用数字签名。 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/习题_15_16.md: -------------------------------------------------------------------------------- 1 | #### P15 考虑图 8-18 中的鉴别协议,其中 Alice 向 Bob 鉴别她自己,我们看来工作正常(即我们没有发现其中有缺陷)。现在假定当 Alice 向 Bob 鉴别她自己的同时,Bob 必须向 Alice 鉴别他自己。给出一个情况,此时 Trudy 假装是 Alice,向 Bob 鉴别她自己是 Alice。(提示,该协议运行的顺序,鉴别过程可由 Trudy 或 Bob 发起,能够任意地交织在一起。特别注意 Bob 和 Alice 将使用不重数这样一个事实。如果不小心的话,能够恶意地使用相同的不重数)。 2 | 3 | * ![](https://github.com/YangXiaoHei/Networking/blob/master/计算机网络自顶向下/08%20计算机网络中的安全/image/p15.png) 4 | 5 | #### P16 一个自然的问题是我们能否使用一个不重数的公钥密码来解决 8.4 节中的端点鉴别问题。考虑下列自然的协议:1、Alice 向 Bob 发送报文 "I am Alice";2、Bob 选择一个不重数并将其发送给 Alice;3、Alice 使用她的私钥来加密该不重数并向 Bob 发送得到的值;4、Bob 对接收到的报文应用 Alice 的公钥。因此,Bob 计算 R 并鉴别了 Alice。 6 | #### a. 画图表示这个协议,使用本书中应用的公钥和私钥的标记法。 7 | #### b. 假定未使用证书。描述 Trudy 怎样能够通过拦截 Alice 的报文,进而对 Bob 假装她是 Alice 而成为一名 “中间人”。 8 | 9 | * a. 10 | * ![](https://github.com/YangXiaoHei/Networking/blob/master/计算机网络自顶向下/08%20计算机网络中的安全/image/p16.1.png) 11 | 12 | * b. 13 | * ![](https://github.com/YangXiaoHei/Networking/blob/master/计算机网络自顶向下/08%20计算机网络中的安全/image/p16.2.png) 14 | 15 | 16 | -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/习题_17_18.md: -------------------------------------------------------------------------------- 1 | #### P17 图 8-19 显示了 Alice 必须执行的 PGP 的操作,以提供机密性、鉴别和完整性。图示出当 Bob 接收来自 Alice 的包时必须执行的对应操作。 2 | 3 | * PGP 的加密过程如下: 4 | * 1、Alice 用对称密钥 Ks 加密报文 m 得到 Ks(m) 5 | * 2、Alice 用 Bob 的公钥 Kb+ 加密 Ks 得到 Kb+(Ks) 6 | * 3、Alice 组合 Ks(m) 和 Kb+(Ks) 得到 P1 7 | * 4、Alice 计算 P1 的 MAC,然后使用私钥 Ka- 加密该 MAC,将 P1 和 Ka-(MAC) 组合成 P2 8 | 9 | * Bob 收到该包后解密过程如下: 10 | * 1、Bob 使用 Alice 的公钥 Ka+ 解密得到 MAC 11 | * 2、Bob 计算 P1 的 MAC,并与解密得到的进行比较,如果不同则丢弃,相同继续。 12 | * 3、Bob 使用自己的私钥 Kb- 解密得到 Ks 13 | * 4、Bob 使用 Ks 解密 Ks(m) 得到原始报文 m 14 | 15 | #### P18 假定 Alice 要向 Bob 发送电子邮件。Bob 具有一个公共-私有密钥对 (Kb+, Kb-),并且 Alice 具有 Bob 的证书。但 Alice 不具有公钥私钥对。Alice 和 Bob (以及全世界) 共享相同的散列函数 H(*)。 16 | #### a. 在这种情况下,能设计一种方案使得 Bob 能够验证是 Alice 创建了报文吗?如果能,用方框图显示 Alice 和 Bob 如何做的。 17 | #### b. 能设计一个对比 Alice 向 Bob 发送的报文提供机密性的方案吗?如果能,用方块图显示 Alice 和 Bob 是如何做的。 18 | 19 | * a. 20 | * ~~Bob 选择一个鉴别密钥,用私钥加密然后发给 Alice,Alice 使用 Bob 的公钥解密后得到鉴别密钥,Alice 给 Bob 发送报文时,使用该密钥加密报文,Bob 没收到解密成功说明是 Alice 发送的报文~~ 21 | * 上面的方法会收到中间人攻击而失效。如果 Alice 不具有公钥私钥对,则无法验证报文的确由 Alice 创建。 22 | 23 | * b. 24 | * Alice 用 Bob 的公钥加密报文即可提供机密性。 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/习题_19_21.md: -------------------------------------------------------------------------------- 1 | #### P19 考虑下面对于某 SSL 会话的一部分的 Wireshake 的输出。 2 | #### a. Wireshake 分组 112 是由客户还是服务器发出的? 3 | #### b. 服务器的 IP 地址和端口号是什么? 4 | #### c. 假定没有丢包和重传,由客户发送的下一个 TCP 报文段的序号将是什么? 5 | #### d. Wireshake 分组 112 包含了多少个 SSL 记录? 6 | #### e. 分组 112 包含了一个主密钥或者加密的主密钥吗?或者两者都不是? 7 | #### f. 假定握手类型字段是 1 字节并且每个长度字段是 3 字节,主密钥(或加密的主密钥)的第一个和最后一个字节的值是什么? 8 | #### g. 客户加密的握手报文考虑了多少 SSL 记录? 9 | #### h. 服务器加密的握手报文考虑了多少 SSL 记录? 10 | 11 | * a. 12 | * 客户端 13 | 14 | * b. 15 | * 服务器的 IP 和端口号是 216.75.194.220:443 16 | 17 | * c. 18 | * 假定没有丢包和重传,下一个 TCP 报文段的序号是 283 19 | 20 | * d. 21 | * 3 个 SSL 记录项 22 | 23 | * e. 24 | * 分组 112 包含一个用服务器公钥加密的主密钥 Pre-Master-Key。 25 | 26 | * f. 27 | * 第一个字节是 bc,最后一个字节是 29 28 | 29 | #### P20 8.6.1 节中表明,不使用序号,Trudy (一名中间人) 能够在一个 SSL 会话中通过互换 TCP 报文段实施破坏。Trudy 能够通过删除一个 TCP 报文段做某种类似的事情吗?在该删除攻击中,她需要做什么才能成功?它将具有什么影响? 30 | 31 | * 如果通过删除 TCP 报文段来搞破坏,那么她必须修改 TCP 中的序号和确认好来保证不会引发 TCP 重传机制。这样的话 Bob 将会在不知情的情况下收到不完整的 SSL 握手报文 (而 TCP 报文段是连续的,因此序号和确认号被修改了)。 32 | 33 | #### P21 假定 Alice 和 Bob 通过一个 SSL 会话通信。假定一个没有任何共享密钥的攻击者,在某分组流中插入一个假冒的 TCP 报文段,该报文段具有正确的 TCP 校验和及序号(以及正确的 IP 地址和端口号)。在接收侧 SSL 将接受该假冒分组并传递载荷给接收应用程序吗?为什么? 34 | 35 | * 不会,因为 SSL 记录项中使用接收方和发送方分别维护的序号进行了 MAC 的计算,所以该分组在完整性校验中无法通过。 36 | 37 | 38 | -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/习题_22_23.md: -------------------------------------------------------------------------------- 1 | #### P22 下列是有关图 8-28 的判断题。 2 | #### a. 当在 172.16.1/24 中的主机向一台 Amazon.com 服务器发送一个数据报时,路由器 R1 将使用 IPsec 加密该数据报。 3 | #### b. 当在 172.16.1/24 中的主机向在 172.16.2/24 中的主机发送一个数据报时,路由器 R1 将改变该 IP 数据报的源和目的地址。 4 | #### c. 假定在 172.16.1/24 中的主机向在 172.16.2/24 中的 Web 服务器发起一个 TCP 连接。作为此次连接的一部分,由 R1 发送的所有数据报将在 IPv4 首部字段最左边具有协议号 50。 5 | #### d. 考虑从在 172.16.1/24 中的主机向在 172.16.2/24 中的主机发送一个 TCP 报文段。假定对该报文段的应答丢失了,因此 TCP 重新发送该报文段。因为 IPsec 使用序号,R1 将不重新发送该 TCP 报文段。 6 | 7 | * a. 8 | * ❌,不使用加密,SPD 指明了什么样的数据报需要用 IPsec 处理,并且用哪个 SA 来加密。 9 | 10 | * b. 11 | * ❌,路由器 R1 不改变 IP 数据报的源和目的地址,而是使用隧道模式,将原来的 IP 数据报封装起来,在外面封装一个新的 IPv4 首部,这个新首部使用了 R1 和 R2 的 IP 地址作为源和目的 IP 地址。 12 | 13 | * c. 14 | * ✅,该协议号指明了载荷是一个被 IPsec 处理过的数据报 15 | 16 | * d. 17 | * ❌,R1 将会重新发送该 TCP 报文段,而 IPsec 使用的序号继续递增。 18 | 19 | #### P23 考虑图 8-28 中的例子。假定 Trudy 是中间人,她能够在从 R1 和 R2 发出的数据报流中插入数据报。作为重放攻击一部分,Trudy 发送一个从 R1 到 R2 发送的数据报的冗余副本。R2 将解密该冗余的数据报并将其转发进分支机构网络吗?如果不是,详细描述 R2 如何检测该冗余的数据报。 20 | 21 | * 如果 Trudy 不去修改其中的序列号,那么 R2 将检测到这是一个冗余分组,因为 R2 必然要维护自己的一个接收序列号。如果 Trudy 修改了序列号,那么该分组将在 R2 的完整性校验中失败。 22 | 23 | -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/习题_25.md: -------------------------------------------------------------------------------- 1 | #### P25 对于尽可能限制但能实现下列功能的一台有状态防火墙,提供一张过滤器表和一张连接表: 2 | #### a. 允许所有的内部用户与外部用户创建 Telnet 会话。 3 | #### b. 允许外部用户冲浪公司位于 222.22.0.12 的 Web 站点。 4 | #### c. 否则阻挡所有入流量和出流量。 5 | #### 内部网络为 222.22/16。在你的答案中,假设连接表当前缓存了 3 个从内向外的连接。你需要虚构适当的 IP 地址和端口号。 6 | 7 | |动作|源地址|目的地址|协议|源端口|目的端口|标志比特|检查连接| 8 | |:---:|:---:|:---:|:---:|:---:|:---:|:---:| :---:| 9 | |拒绝|全部|全部|全部|全部|全部|全部|| 10 | |允许|222.22/16|222.22/16 外部|TCP| > 1023|23|任意|| 11 | |允许|222.22/16外部|222.22/16|TCP| 23| > 1023|ACK| x | 12 | |允许|222.22/16 外部|222.22.0.12|TCP| > 1023|80|任意| | 13 | |允许|222.22.0.12|222.22/16 外部|TCP| 80|> 1023|任意| | 14 | 15 | |源地址|目的地址|源端口|目的端口| 16 | |:---:|:---:|:---:|:---:| 17 | |222.22.0.16|145.3.23.78|16322|23| 18 | |222.22.0.16|222.7.98.101|14324|23| 19 | |222.22.0.12|58.12.32.178|23439|23| 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/习题_26.md: -------------------------------------------------------------------------------- 1 | #### P26 假设 Alice 要使用 TOR 类似的服务访问 Web 站点 activist.com。该服务使用两个不串通的代理服务器 Proxy1 和 Proxy2。Alice 首先从某个中央服务器获得对 Proxy1 和 Proxy2 的证书(每个都包含一个公钥)。用 K1+()、K2+()、K1-()、K2-() 表示加密/解密时所使用的 RSA 公钥和 RSA 私钥。 2 | #### a. 使用一幅时序图,提供一个(尽可能简单的)协议允许 Alice 创建一个用于 Proxy1 的共享会话密钥 S1。S1(m) 表示为使用共享密钥 S1 对数据 m 加密/解密。 3 | #### b. 使用时序图,提供一个(尽可能简单的)协议允许 Alice 创建一个对于 Proxy2 的共享会话密钥 S2,而不向 Proxy2 透露她的 IP 地址。 4 | #### c. 现在假设创建了共享密钥 S1 和 S2。使用时序图提供一个协议(尽可能简单并且不使用公开密钥密码),该协议允许 Alice 从 activist.com 请求一个 html 页面而不向 Proxy2 透露她的 IP 地址,并且不向 Proxy1 透露她正在访问哪个站点。你的图应当终止在一个 HTTP 请求到达 acitivist.com。 5 | 6 | * ![](https://github.com/YangXiaoHei/Networking/blob/master/master/计算机网络自顶向下/08%20计算机网络中的安全/image/p26.png) -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/复习题_81.md: -------------------------------------------------------------------------------- 1 | #### R1 报文机密性和报文完整性之间的区别是什么?你能具有机密性而没有完整性吗?你能具有完整性而没有机密性吗?证实你的答案。 2 | 3 | * 报文机密性:是指入侵者即使能解惑到你的分组,但是无法破译其中的内容。 4 | * 报文完整性:入侵者可以篡改你的分组,即便他无法破译其中内容,但是他可以破坏该报文,让你的接收方收到被蓄意损毁的分组。而接收方在收到报文后可以验证该报文没有被篡改,蓄意损坏。 5 | 6 | * 可以具有机密性而没有完整性,因为即便入侵者无法破译,他仍然可以破坏你的分组。 7 | * 可以具有完整性而没有机密性,发送明文,然后在后面附上 MAC,所有入侵者都能读懂你的报文(因为是明文),但是无法篡改,无法破坏,或者说他可以这样做,但是会被接收方识别出来。 8 | 9 | #### R2 因特网实体(路由器,交换机,DNS 服务器、Web 服务器、用户端系统)经常需要安全通信。给出三个特定的因特网实体对的例子,它们需要安全通信。 10 | 11 | * 使用 OSPF 的 AS 内部的路由器需要互相通告正确的报文,因此有报文完整性的要求。 12 | * 用户在电子商城购买商品需要传输支付密码等信息,所以需要报文机密性。 13 | * 国家领导人之间需要保证通信无法被窃听,篡改,因此需要机密性和完整性。 -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/复习题_82.md: -------------------------------------------------------------------------------- 1 | #### R3 从服务的角度,对称密钥系统和公开密钥系统之间一个重要的差异是什么? 2 | 3 | * 对称密钥系统需要通信双方交换密钥,因此在交换密钥的过程中可能造成密钥的被入侵者知晓的可能性。 4 | * 公开密钥系统不需要通信双方交换密钥,因此排除了密钥在传输过程中被入侵者知晓的可能性。 5 | 6 | #### R4 假定某入侵者拥有一个加密报文以及该报文的解密版本,这个入侵者能发起已知密文攻击呢?还是已知明文攻击,或者选择明文攻击? 7 | 8 | * 因为入侵者通过报文和报文的加密版本知晓了许多明文和密文间的 “匹配”,因此他能够发起已知明文攻击。 9 | 10 | #### R5 考虑一个 8 块密码。这个密码有多少种可能的输入块?有多少种可能的映射?如果我们将每种映射视为一个密钥,则该密码具有多少种可能的密钥? 11 | 12 | * 8 bit 密码块,那么就是 `2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 = 2^8` 种输入块,即 256 种输入块。 13 | 14 | * 有 256 种输入块,那么映射关系总共有 256! 种。 15 | 16 | * 也就是说该密码具有 256! 种可能的密钥。 17 | 18 | #### R6 假定 N 个人中每个人都和其他 N - 1 个人使用对称密钥通信,任两个人 (i 和 j)之间的所有通信对该 N 个人的组中的所有人都是可见的,且该组中的其他人都不应当能够解密他们的通信。则这个系统总共需要多少个密钥?现在假定使用公开密钥密码。此时需要多少个密钥? 19 | 20 | * 假设有 4 个人 A B C D,A 如果和 B C 通信使用相同的密钥,那么 A 和 B 通信时,C 不但可以看见,还可以解密,因此 A 和 B C D 通信应当都使用不同的密钥,就是说 A 需要有 3 个密钥,对于 B 来说,与 A 通信的密钥已经被 A 决定了,因此 B 和 C D 通信需要 2 个密钥,以此类推,N 个人通信总共需要 `N*(N-1)/2` 个密钥。 21 | 22 | * 假定使用公开密钥密码,总共需要 N 个密钥对,即 2N 个密钥。 23 | 24 | #### R7 假定 n = 10000、a = 10023 和 b = 10004。请你使用等同的模运算来心算 (a * b) mod n 25 | 26 | * 使用公式 `(a * b) mod n = [(a mod n) * (b mod n)] mod n` 27 | * 于是得到 92 28 | 29 | #### R8 假设你要加密对应于报文 10101111 的十进制数来加密该报文。该十进制数是什么? 30 | * `128 + 32 + 15 = 175` 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /计算机网络自顶向下/08 计算机网络中的安全/复习题_89.md: -------------------------------------------------------------------------------- 1 | #### R29 状态分组过滤器维护两个数据结构。给出它们的名字并简单地讨论它们做些什么。 2 | 3 | * 状态过滤器的连接表、状态过滤器的访问控制列表 4 | * 连接表用来跟踪一条进行中的连接,当它看到三次握手时观察到一条连接的开始,当它看到一个 FIN 分组时观察到该连接的结束,结合连接表和访问控制表共同决定一个分组是否被允许进入和流出。 5 | * 访问控制表用来根据策略允许或拒绝一个分组的进入或流出。 6 | 7 | #### R30 考虑某传统(无状态的)分组过滤器。该分组过滤器可能基于 TCP 标志位以及其他首部字段过滤分组。这种说法是正确还是错误? 8 | 9 | * 正确 10 | 11 | * 传统分组过滤器通常基于下列因素: 12 | * IP 源或目的地址。 13 | * 在 IP 数据报中的协议类型字段: TCP、UDP、ICMP、OSPF (⚠️ OSPF 由 IP 报文承载,RIP 由 UDP 报文承载)等 14 | * TCP 标志比特: SYN、ACK 等。 15 | * ICMP 报文类型。 16 | * 数据报离开和进入网络的不同规则 17 | * 对不同路由器接口的不同规则 18 | 19 | #### R31 在传统的分组过滤器中,每个接口能够具有自己的访问控制表。这种说法是正确还是错误? 20 | * 正确 21 | 22 | #### R32 为什么应用程序网关必须与分组过滤器协同工作才能有效? 23 | 24 | * 应用程序网关实现了根据分组应用层数据进行过滤的逻辑,但是组织内部的用户流量如果不流经应用程序网关,那么应用程序网关将没有任何意义,所以先强制所有流量都进入应用程序网关,流量再从应用程序网关进入网关路由器。当然这里的应用程序网关必须先禁止掉所有源 IP 不是应用程序网关的分组流量。 25 | 26 | 27 | 28 | 29 | 30 | --------------------------------------------------------------------------------