day26(继承、为什么三次握手、TCP/UDP区别、socket基本操作)
- 简单介绍一下继承:
继承就是利用已有的数据类型来定义新的数据类型,所定义的新的类型不仅拥有新定义的成员,同时还拥有旧的成员。
一个基类派生的继承是单继承,从多个基类派生的继承称为多继承。
三种继承方式,私有的继承,成员都变作私有的,保护继承都变成保护的,公有继承不变。但是三种方式的私有成员都不被派生类继承,即在派生类里不可见。 - 为什么三次握手,第三次握手是为了防止一个情况:就是客服端发出一个建立连接的请求后,因为某些原因滞留了较长时间,而第二个请求连接建立成功使用后释放完成,此时又收到第一个请求,服务端给出确认,但是客服端并没有发出建立连接的请求,就不会理睬这个服务端的确认报文段。假如没有第三次握手,服务端就会认为连接已经建立,就会一直等待客服端发来数据。
- TCP和UDP的区别
连接上,tcp是面向连接的传输协议,传输数据前需要建立连接。udp则不需要。
服务对象,tcp是点对点的服务。udp支持一对一,一对多,多对多。
可靠性,tcp提供可靠交付,无差错,不丢失,按序到达。udp尽最大努力交付,不保证可靠性。
拥塞控制,流量控制,tcp拥有拥塞控制和流量控制保证数据传输的安全性。udp没有拥塞控制,网络拥塞不会影响源主机的发送效率。
报文长度,tcp是动态的报文长度,根据接收方窗口大小和当前网络拥塞情况决定的。udp面向报文,不合并,不拆分,保留上面传下来的报文的边界。
首部开销,tcp首部开销大,首部20字节。udp首部开销小,8个字节。 - socket的基本操作
socket(int domain,int type,int protocol);
函数成功时返回一个小的非负整数值,称为套接口描述字(Socket Descriptor),简称套接字。三个参数:
domain:协议域,又称协议族。协议族决定了套接口的地址类型,在通信中必须采用对应的地址。常用的协议族有:AF_INET,AF_INET6,AF_UNIX等。
type:指定套接口类型,常用的:SOCK_STREAM,SOCK_DGRAM等。
protocol:指定协议。常用的:IPPROTO_TCP,IPPTPTP_UDP等,分别代表tcp,udp。
bind()函数
int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
bind函数把一个本地协议地址赋予套接口。三个参数:
sockfd:即套接字,它是通过socket()函数创建的,他唯一标识一个套接口。
addr:一个指向特定于协议的地址结构的指针。
addrlen:指出第二个参数中结构体的长度。
服务器启动时会绑定一个众所周知的地址(如IP地址+端口号),用于提供服务,客户也可以通过它来连接服务器;而客服端是系统自动分配的一个端口号和自身的IP地址组合。所以服务端在listen之前会调用bind。
listen()函数
int listen(int socket,int backlog);
listen函数仅有由TCP服务器调用,做两件事:
listen函数把一个未连接的套接口转换成一个被动套接口,指示内核可以接受指向该套接口的连接请求。
backlog:规定了内核应该为相应套接口排队的最大连接个数(包括已连接和未连接的队列)。
connect()函数
int connect(int sockfd,const struct sockaddr*addr,socklen_t addrlen);
TCP客户用connect函数来建立与TCP服务器的连接。
connect函数的第一个参数即为客户端的套接字,第二个参数为一个指向套接口地址结构的指针。第三个参数为第二个参数中结构体的长度。
accept()函数
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
第一个参数为服务器的套接字,第二个参数用于返回客户端协议地址,第三个参数为协议地址的长度。
如果accept成功,则返回值是由内核自动生成的一个全新的描述字,代表与所返回客户的TCP连接。
close()函数
int close(int fd);
close函数用来关闭套接口,并终止TCP连接。
close的操作只是使相应的套接字的引用计数减1,只有当引用计数为0的时候,才会触发TCP客户端向服务端发送终止连接请求。
描述一个面向连接的客户端socket程序主要步骤:
加载套接字库
创建套接字(socket())
向服务器发送连接请求(connect())
和服务器进行通信
关闭套接字(close())
shutdown()函数
int shutdown(int sockfd,int howto);
关闭一个socket有两种方法,一是close,二是shutdown。
参数:sockfd是需要关闭的套接口描述字,howto是允许为shutdown操作选择的以下几种方式。
SHUT_RD:关闭连接的读端,也就是该套接字不再接受数据。进程不能对其任何读操作。
SHUT_WR:关闭连接的写端,进程不能再对此套接字发出任何写操作。但可以读。
SHUT_RDWR:相当于调用两次shutdown,一次RD一次WR。
close是在引用计数为0时才关闭TCP连接,shutdown是不管引用计数,直接关闭。
close是同时终止读和写,TCP是全双工的,有时候需要半关闭,shutdown就可以完成。