码迷,mamicode.com
首页 > 系统相关 > 详细

Linux下的socket编程实践(一) 网络基本知识以及 TCP/IP简述

时间:2015-10-01 20:34:55      阅读:363      评论:0      收藏:0      [点我收藏+]

标签:linux   网络   socket   tcp   通信   

ISO/OSI七层参考模型

技术分享

1.物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。(标志:RJ-45)
2.数据链路层:定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输,交换机属于本层。
3.网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。(标志:路由选择,IP/OSPF,ICMP,IGMP)
4.传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。
5.会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。
6.表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换吗(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。
7.应用层:是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。
(标志:HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3

TCP/IP四层模型

ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用

技术分享

应用层: FTP,TELNET为了完成一定的用户需求,自定义协议,QQ协议

传输层:TCP UDP

网络层: ICMP,IP,IGMP

数据链路层: ARP,RARP硬件接口

运行FTP协议的两台主机:

技术分享

每个层次具有自己的协议,每层之间进行通信;他们的语言一致,我们可以看作是A进程和B进程之间进行对等通信,也就是虚电路(并不是真正的建立连接线)对等数据传输的是逻辑流,例如现在有两个人通过手机进行通信,好像就在耳边,其实是通过电磁波。

封装:

技术分享

分用

技术分享


端口:

端口由IANA分配和控制他们紧密绑定一些服务:0~1023
注册端口:1024~49151,在这之间端口松散的绑定一些服务
动态或者私有(临时)端口 49152~65535(实际上从1024)开始分配

链路层:

以太网的帧格式

技术分享

链路层的数据包,称为以太网帧; 链路层不识别IP地址[因为IP地址是逻辑地址],链路层识别物理网卡MAC地址[硬件地址]需要根据IP地址(逻辑地址)找到对方的MAC地址(ARP地址解析协议)[MAC —> IP地址方向地址解析];MAC->IP 反向地址解析(RARP协议); 类型(2字节)用来区分IP,ARP,RARP。

//以太网首部代码  
struct ethernet_hdr  
{  
    char dest_mac[6];  
    char src_mac[6];  
    short protocol;  
};  

MTU/路径MTU

链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。以太网的MTU1500,你可以用 netstat -i 命令查看这个值。如果IP层有数据包要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(fragmentation)操作,使每一片的长度都小于或等于MTU。另外,多个网络的链路层可能有不同的MTU,选择通信路径中较小的MTU,称作路径MTU;但是分片会降低网络的通信效率,应该尽量避免。

ARP地址解析协议

技术分享

本地ARP高速缓存

技术分享

//ARP首部代码  
struct arp_hdr  
{  
    unsigned short hwtype;  // 固定1  
    unsigned short protype; // 固定0x0800(代表为IP协议做请求)  
    unsigned char hwaddrlen;    // 固定6(即MAC地址长度)  
    unsigned char proaddrlen;   // 固定4 (即IP地址长度)  
    unsigned short opcode;  // Request - 1, Reply - 0x0002  
    unsigned char sender_mac[6];    // 发送者MAC  
    unsigned char sender_ip[4]; // 发送者IP  
    unsigned char dest_mac[6];  // 接收者MAC  
    unsigned char dest_ip[4];   // 接收者IP  
};  

源端和目的端都将加入ARP缓冲区。

RARP反向地址解析协议,适用于无盘工作站,IP一般存于配置文件中

这个时候要想获取IP地址,就通过RARP协议,通过向RARP服务器发送请求

网络层:

IP数据报

技术分享

首部最大长度是15*4=60个字节,15最为单位,选项最多有40个字节。

协议类型8位 判断高层是TCP还是UDP,头部校验和校验IP头部的完整性,并不校验数据的完整性。

服务类型:

技术分享

IP数据报最大可达65535;分片共享一个标识号

技术分享

技术分享

技术分享

网际校验和算法:  http://blog.csdn.net/zhq651/article/details/8515575

//IP首部代码  
struct ip_hdr  
{  
    char  ver_hl;  
    char  tos;  
    unsigned short len;  
    unsigned short id;  
    unsigned short fragment;  
    char ttl;  
    char protocol;  
    unsigned short hdr_chksum;  
    char src_ip [4];  
    char dest_ip [4];  
};  
路由过程:

技术分享


顺序:搜索匹配的主机地址

搜索网络地址

搜索默认表项

ICMP协议

ICMP协议用于传递差错信息、时间、回显、网络信息等控制数据,工作于网络层(IP),Ping程序使用ICMP协议实现。

技术分享

技术分享

//ICMP首部代码  
struct icmp_hdr  
{  
    char    type;           // ICMP报文类型  
    char    code;           // “子类型”  
    unsigned short  icmpchksum; // 校验和  
};  
UDP报文格式

技术分享

//UDP首部代码  
struct udp_hdr  
{  
    unsigned short src_port;  
    unsigned short dest_port;  
    unsigned short len;  
    unsigned short chksum;  
}; 

TCP报文头部:

技术分享


连接建立三次握手

 技术分享

连接终止四次挥手

 技术分享

技术分享

注:慢启动中的慢 是指基数比较小。


技术分享

步骤a:应用程序ping会判断发送的是主机名还是IP地址,调用函数gethostbyname()解析主机机B,将主机名转换成一个32位的IP地址。这个过程叫做DNS域名解析.

步骤b:ping程序向目的IP地址发送一个ICMP的ECHO包

步骤c:将目标主机的IP地址转换为48位硬件地址,在局域网内发送ARP请求广播,查找主机B的硬件地址。

步骤d:主机B的ARP协议层接收到主机A的ARP请求后,将本机的硬件地址填充到应答包,发送ARP应答到主机A。

步骤e:发送ICMP数据包到主机B

步骤f:主机B接收到主机A的ICMP包,发送响应包。

步骤g:主机A接收到主机B的ICMP包响应包。






















版权声明:本文为博主原创文章,未经博主允许不得转载。

Linux下的socket编程实践(一) 网络基本知识以及 TCP/IP简述

标签:linux   网络   socket   tcp   通信   

原文地址:http://blog.csdn.net/nk_test/article/details/48847449

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!