当前位置 博文首页 > 码农之家:【TCP/IP】从在浏览器中输入网址按回车键说起
在个人电脑上,用浏览器冲浪是再常用不过的一个操作了,但在浏览器中输入网址按下回车键背后发生的网络事件你清楚吗?
1、网络协议分层,其好处:
2、PDU,即protocol data unit,每一层使用自己层的协议和别的系统的对应层相互通信,协议层的协议在对等层之间交换的信息叫协议数据单元。各层的PDU如下:
3、封装和解封装
以访问web服务器、DHCP获取PC的地址为例,其中涉及的协议有:
TCP、IP、ARP、DNS、DHCP等,具体而言:
这里以有线连接路由器LAN口为例来说明。
要上网,首先要用网线连接路由器的LAN口和PC的网口,物理层连好后,对应LAN口会发LINK UP消息给系统,进而触发下面后续操作。
这一步是人工介入的,后面多数由操作系统自动完成。
这一步是人工介入的,实际不光是打开网页,打开其他需要网络的APP,也是类似的过程。
hptr=gethostbyname(“www.csdn.net”)
/*create socket*/
struct sockaddr_in si;
si.sin_family = AF_INET;
si.sin_port = htons(80);
si.sin_addr.S_un.S_addr = inet_addr(ipstr);
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == -1 || sock == -2)
return ;
/* connect server */
connect(sock, (SOCKADDR*)&si, sizeof(si));
/*send request to http server*/
char request[1024] = "GET /?st=1 HTTP/1.1\r\nHost:";
strcat(request, host);
strcat(request, "\r\nConnection:Close\r\n\r\n");
int ret = send(sock, request, strlen(request), 0);
/*get web page contents*/
FILE *f = fopen("recieved.txt", "w");
int isstart = 0;
while (ret > 0)
{
const int bufsize = 1024;
char* buf = (char*)calloc(bufsize, 1);
ret = recv(sock, buf, bufsize - 1, 0);
fprintf(f, "%s", buf);
free(buf);
}
fclose(f);
closesocket(sock);
在上一步建立TCP socket等相关操作,背后是大名鼎鼎的TCP三次握手:
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 10.42.113.129 10.42.113.132 20
10.42.113.128 255.255.255.192 10.42.113.132 10.42.113.132 20
10.42.113.132 255.255.255.255 127.0.0.1 127.0.0.1 20
10.255.255.255 255.255.255.255 10.42.113.132 10.42.113.132 20
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1
224.0.0.0 240.0.0.0 10.42.113.132 10.42.113.132 20
255.255.255.255 255.255.255.255 10.42.113.132 10.42.113.132 1
Default Gateway: 10.42.113.129
C:\Users\1024>arp -a
接口: 10.40.164.55 --- 0xb
Internet 地址 物理地址 类型
10.42.164.2 74-41-14-16-ad-c0 动态
10.42.164.3 00-11-5e-00-01-01 动态