协议栈——Linux的优点之一就是在于它丰富而稳定的网络协议栈,其范围是从协议无关层(如通用的socket层接口和设备层)到各种网络协议的实现;
telnet:类同ssh,远程连接协议 例:ssh root@192.168.1. ...
ping:网络监测工具 例:ping www.baidu.com (发送域名给服务器,服务器返回其 IP 地址给用户)
HTTP:网页信息传送协议
DHCP:手机的IP 地址
TCP/IP协议:可靠的(发出后还等待回信)、面向连接的、基于流的通信协议
UDP协议; 不可靠的(发出后随缘)、无连接的、基于数据报的通信协议
IP和端口号的区别与联系:
IP就是一个电脑节点的网络物理地址,就像你的家住的那个地址;127.0.0.1 是固定ip地址,代表当前计算机,相当于面向对象里的 "this"。
端口是该计算机逻辑通讯接口,不同的应用程序用不同的端口,就像你家里的各个不同的房间,卧室用来睡觉,餐厅用来吃饭。服务器和客户端之间的通信通过端口进行。
给你打个不太恰当的比喻,回归以往的手写寄信方式!你要向你的朋友写一封信,一般都是在信封上写上你朋友的地址和你地址,这就好比,这封信=数据包,你们双方的地址=你们双方得IP地址(IP地址公开化)!然后邮递员把信送到你朋友家门口了(至于邮递员是怎么查到的走什么路线的对应的则是网络中路由表的作用,在此不作细谈),这时你朋友需要开门出来拿,而这扇门就好比端口了!要是门关了(端口关闭),这封信就会被送回给你,在计算机中的具体表现就是在命令字符行(cmd)下ping命令的使用!在网络技术中,端口大致指两种:一是物理意义上的端口,二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等,这些端口都是默认开启的,这也就为系统的安全潜伏了隐患,所以平时就要注意关闭一些不必要的端口!
进行Socket编程的常用函数有:
int socket(int family, int type, int protocol);
功能:
socket()打开一个网络通讯端口,如果成功的话,就像open()一样返回一个文件描述符,应用程序可以像读写文件一样用read/write在网络上收发数据,如果socket()调用出错则返回-1。
创建监听套接字,此时的套接字还没有和服务器绑定。
参数:
对于IPv4,family参数指定为AF_INET;
对于TCP协议,type参数指定SOCK_STREAM,表示面向流的传输协议如果是UDP协议,则type参数指定为SOCK_DGRAM,表示面向数据报的传输协议;
protocol参数的介绍从略,指定为0即可。
int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
功能:
bind()的作用是将参数sockfd和myaddr(即服务器的信息)绑定在一起,使用于网络通讯的套接字sockfd监听myaddr所描述的地址和端口号。
结构体sockaddr_in 的初始化:
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
首先将整个结构体清零,然后设置地址类型为AF_INET,网络地址为INADDR_ANY,这个宏表示本地的任意IP地址,因为服务器可能有多个网卡,每个网卡也可能绑定多个IP地址,这样设置可以在所有的IP地址上监听,直到某个客户端建立了连接时才确定下来到底用哪个IP地址,端口号为SERV_PORT,我们定义为8000 。