"Linux"我感觉仅从字面上讲就感觉不是很简单,千里之行,始于足下,接下来要开始有关Linux网络编程的学习了。我写的博客更多的是为了记录自己的学习知识点,有很多地方可能存在一些问题,毕竟水平低,敬请谅解。
今天看了好久有关Linux的书,对Linux有了一个比较笼统的了解。根据知乎里的推荐:
关于Linux的基本知识点,自己也是学习了别人总结的知识点,个人感觉总结得比较全面:
程序员必备!非常全的Linux基础知识点,你知道多少?
TCP协议分为两个不同的协议
用来检测网络传输中差错的循环数控制协议TCP(可靠传输)
专门负责对不同网络进行互联的互联协议IP(不可靠传输)
从此,TCP/IP协议诞生
计算机与网络设备之间如果要相互通信,双方就必须基于相同的方法.比如如何探测到通信目标.由哪一边先发起通信,使用哪种语言进行通信,怎样结束通信等规则都需要事先确定.不同的硬件,操作系统之间的通信,所有这一切都需要一种规则.而我们就将这种规则称为协议 (protocol).
也就是说,TCP/IP 是互联网相关各类协议族的总称。
OSI模型相关的协议已经很少使用,但是模型本身却非常通用
OSI模型是一个理想化的模型,尚未有完整的实现
OSI模型有七层结构:
事实上,TCP/IP协议是internet事实上的工业标准:
一共有四层:
至于为什么要分层呢?
把TCP/IP协议分层后,如果后期某个地方需要设计修改,那么就无须全部替换,只需要将需要改动的层变动。而且从设计上来说,也便得更加的简单。处于应用层上的应用可以只考虑分配给自己的任务,而不需要弄清楚对方在哪个地方又进行着怎样的传输
MAC地址:48位全球唯一的用来作为网络设备的身份标识。在网络接口与物理层中主要的协议为:ARP/RARP。
ARP:主要通过其IP地址找到MAC地址;
RARP:通过MAC地址找到对应的IP地址
PPP协议:他是一种拨号协议(3G,4G,5G,GPS)
IP协议:Internet protocal(分为IPV4和IPV6)
ICMP:Internet控制管理协议(ping命令)
IGMP:Internet分组管理协议(广播,组播等)
TCP:(Transfer Control protocol,传输控制协议 )提供面向对象连接的,一对一的可靠数据传输的协议。(数据无误、数据无丢失、数据无序性、数据无重复到达的通信)
UDP:(user Datagram Protocol,用户数据报协议):提供不可靠,无连接的尽力传输协议(是不可靠的无连接的协议,在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输)
SCTP:(Stram Control Transmission Protocol:流控制传输协议),TCP的增强版,提供面向连接的,多对一或多对多的可靠数据传输协议
TCP和UDP
TCP和UDP都是传输层协议,但是两者具有不同的特效,同时也具有不同的应用场景。
面向报文:
面向报文的传输方式是应用层交给UDP多长的报文,UDP发送多长的报文,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。
面向字节流:
虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应该程序传送的数据块太长,TCP就可以把它划分短一些再传送。
关于TCP的三次握手与四次挥手:
第一次握手:建立连接。客户端发送连接请求报文段,并将syn(标记位)设置为1,Squence Number(数据包序号)(seq)为x,接下来等待服务端确认,客户端进入SYN_SENT状态(请求连接);
第二次握手:服务端收到客户端的 SYN 报文段,对 SYN 报文段进行确认,设置 ack(确认号)为 x+1(即seq+1 ; 同时自己还要发送 SYN 请求信息,将 SYN 设置为1, seq为 y。服务端将上述所有信息放到 SYN+ACK 报文段中,一并发送给客户端,此时服务器进入 SYN_RECV状态。
SYN_RECV是指,服务端被动打开后,接收到了客户端的SYN并且发送了ACK时的状态。再进一步接收到客户端的ACK就进入ESTABLISHED状态。
第三次握手:客户端收到服务端的 SYN+ACK(确认符) 报文段;然后将 ACK 设置为 y+1,向服务端发送ACK报文段,这个报文段发送完毕后,客户端和服务端都进入ESTABLISHED(连接成功)状态,完成TCP 的三次握手。
上面的解释可能有点不好理解,《图解HTTP》中的一副插图 形象的解释了以上的过程。
当客户端和服务端通过三次握手建立了 TCP 连接以后,当数据传送完毕,断开连接就需要进行TCP的四次挥手。其四次挥手如下所示:
第一次挥手
客户端设置seq和 ACK ,向服务器发送一个 FIN(终结)报文段。此时,客户端进入 FIN_WAIT_1 状态,表示客户端没有数据要发送给服务端了。
第二次挥手
服务端收到了客户端发送的 FIN 报文段,向客户端回了一个 ACK 报文段。
第三次挥手
服务端向客户端发送FIN 报文段,请求关闭连接,同时服务端进入 LAST_ACK 状态。
第四次挥手
客户端收到服务端发送的 FIN 报文段后,向服务端发送 ACK 报文段,然后客户端进入 TIME_WAIT 状态。服务端收到客户端的 ACK 报文段以后,就关闭连接。此时,客户端等待 2MSL(指一个片段在网络中最大的存活时间)后依然没有收到回复,则说明服务端已经正常关闭,这样客户端就可以关闭连接了。
完整的过程如下:
网络访问协议:HTTP/HTTPS
邮件发送接收协议:POP3(收)/SMTP(发) 、IMAP(可接受邮件的一部分)、 FTP
Telnet/SSH:远程登录
嵌入式相关:
NTP:网络时钟协议
SNMP:简单网络管理协议(实现对网络设备集中式管理)
RTP/RTSP:用来传输音频的协议(安防监控)
网络封包是指数据包在网络中用指定的协议传输过程。
计算机只能识别二进制的数据,数据也是用二进制的方式存储在计算机中。要想实现多台计算机之间的通信,就要依赖一定的通信协议,如TCP/IP/HTTP等网络协议。为了区分每个协议,数据在传输过程中,会被用到的协议加上指定的格式。也可以理解为对数据的打包发送。例如:快递人员要把你购买的东西送到你家,就要先包装好,然后加上你的个人信息,最后送到你手中,整个过程称为封包。
流式嵌套字(SOCK_STREAM): (唯一对应着TCP)
提供一个面向连接,可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据淹没慢的接收方。数据被看做字节流,无长度限制。
数据报嵌套字(SOCK_DGRAM): 唯一对应着UDP
提供无连接服务。数据报一独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收
原始嵌套字(SOCK_RAM): (对应着多个协议,发送穿透了传输层)
可以对较低层次协议如IP、ICMP直接访问
IP地址是Internet中主机的标识
- Internet中的主机要与别的机器通讯必须具有一个IP地址
- IP地址为32位(IPV4)或者128位(IPV6)
P)
- 每个数据包都必须携带目的的IP地址和源IP地址,路由器依靠此信息为数据包
不同类型CPU的主机中,内存存储多字节整数序列有两种方法,称为主机字节序(HBO):
in_addr_t inet_addr(const char *cp):
cp:点分形式的IP地址,结果是32位整数(内部包含了字节序的转换,默认是网络字节序的模式)
特点:
①仅仅适用于IPV4
②当出错时,返回-1
③此函数不能用于255.25.255.255的转换
inet_pton()/inet ntop():
#include
int inet_pton(int af,const char*src,void *dat)
特点:
①适用于IPV4和IPV6
②能正确的处理255.255.255.255的转换问题
参数:
①af:地址协议族(AF_INET或INET6)
②src:是一个指针(填写点分形式的IP地址[主要是ipv4])
③dst:转换的结果给到dst
注意:
RETURN VALUE
inet_pton() return 1 on success(network address was successfully converted).