1. 建立TCP服务器的各个系统调用
socket(),bind(),listen(),accept(),send()和recv()
socket网络编程有哪些系统调用?其中close是一次就能直接关闭的吗,半关闭状态是怎么产生的?
由于是双向的,两边都要发FIN,服务器关闭socket,用close会将该socket的计数-1,如果引用还是大于0,那么socket端口状态保持不变,如果为0,会将sender缓冲中的数发出去,然后发送FIN。可能在多进程中出现半关闭,所以应该使用
shutdown(sockfd, SHUT_RDWR); close(sockfd);
shutdown不考虑描述符的引用计数,直接关闭描述符,到LAST_ACK状态。也可选择中止一个方向的连接,只中止读或只中止写。
如果有多个进程共享一个套接字,close每被调用一次,计数减1,直到计数为0时,也就是所用进程都调用了close,套接字将被释放。
在多进程中如果一个进程调用了shutdown(sfd, SHUT_RDWR)后,其它的进程将无法进行通信。但,如果一个进程close(sfd)将不会影响到其它进程。
2.在浏览器中输入URL后执行的全部过程
如www.baidu.com
-
浏览器搜索自己的DNS缓存(维护一张域名与IP地址的对应表)
-
若没有,则搜索操作系统中的DNS缓存(维护一张域名与IP地址的对应表)
-
若没有,则搜索操作系统的hosts文件(Windows环境下,维护一张域名与IP地址的对应表,位置一般在 C:\Windows\System32\drivers\etc\hosts)
-
若没有,则操作系统将域名发送至 本地域名服务器- -(递归查询方式),本地域名服务器 查询自己的DNS缓存,查找成功则返回结果,否则,(以下是迭代查询方式) 4.1 本地域名服务器 向根域名服务器(其虽然没有每个域名的具体信息,但存储了负责每个域,如com、net、org等的解析的顶级域名服务器的地址)发起请求,此处,根域名服务器返回com域的顶级域名服务器的地址 4.2 本地域名服务器 向com域的顶级域名服务器发起请求,返回baidu.com权限域名服务器(权限域名服务器,用来保存该区中的所有主机域名到IP地址的映射)地址 4.3 本地域名服务器 向baidu.com权限域名服务器发起请求,得到www.baidu.com的IP地址
-
本地域名服务器 将得到的IP地址返回给操作系统,同时自己也将IP地址缓存起来
-
操作系统将 IP 地址返回给浏览器,同时自己也将IP地址缓存起来 至此,浏览器已经得到了域名对应的IP地址
3. HTTP请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
-
请求行
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT等。
-
请求头
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
网络了解的少,还得花时间多学习学习,待续。。。