Socket编程实践(1) --TCP/IP简述

ISO的OSI

OSI(open system interconnection)开放系统互联模型是由ISO国际标准化组织定义的网络分层模型,共七层, 从下往上为:


OSI七层参考模型


物理层(Physical Layer)


物理层定义了所有电子及物理设备的规范,为上层的传输提供了一个物理介质,本层中数据传输的单位为比特(bit/二进制位)。属于本层定义的规范有EIA/TIA RS-232、RJ-45等,实际使用中的设备如网卡属于本层。


数据链路层(Data Link Layer)


对物理层收到的比特流进行数据成帧。提供可靠的数据传输服务,实现无差错数据传输。在数据链路层中数据的单位为帧(frame)。属于本层定义的规范有HDLC、PPP、STP等,实际使用中的设备如switch交换机属于本层。


网络层(Network Layer)


网络层负责将各个子网之间的数据进行路由选择,分组与重组。本层中数据传输的单位为数据包(packet)。属于本层定义的规范有IP、RIP、OSPF、ICMP、IGMP等。实际使用中的设备如路由器属于本层。


传输层(Transport Layer)


提供可靠的数据传输服务(注意OSI的传输层与TCP/IP的传输层的功能不尽相同),它检测路由器丢弃的包,然后产生一个重传请求,能够将乱序收到的数据包重新排序。


会话层(Session Layer)


管理主机之间会话过程,包括会话建立、终止和会话过程中的管理


表示层(Presentation Layer)


表示层对网络传输的数据进行变换,使得多个主机之间传送的信息能够互相理解,包括数据的压缩、加密、格式转换等。


应用层(Application Layer)


应用层与应用程序界面沟通,以达至展示给用户的目的。 在此常见的协定有: HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等

TCP/IP模型

TCP/IP主要协议

数据封装(Encapsulation)图解

数据分用(Demultiplexing:解包)图解

链路层

以太网帧格式

以太网帧说明:

链路层的数据包,称为以太网帧; 链路层不识别IP地址[因为IP地址是逻辑地址],链路层识别物理网卡MAC地址[硬件地址]; 需要根据IP地址找到对方的MAC地址(ARP地址解析协议)[MAC —> IP地址方向地址解析];

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

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
};

网络层

IP数据报


各个字段说明


版本


IP协议版本号, IPv4此字段值为4, IPv6此字段值为6


首部长度


取值范围5(0101)~15(1111), 单位为4字节, 因此首部最长为60字节


服务类型


长度为8位。此字段包含3位的优先权(现已忽略),4位的服务类型子字段(只能有一位置1)和1位的保留位(必须置0)。4位的服务类型分别为最小延迟(D)、最大吞吐量(T)、最高可靠性(R)、最小费用(F), 详细解释见下图


总长度


该字段长度为16位, 以字节为单位, 该字段长度包含IP的头部和数据部分, IP数据报最大长度为65535字节


标识


16位长度, 唯一标识一个数据报,如果发送一个数据包, 则该值加1, 如果数据报分段,则每个分段的标识都一样, 各个分片共享一个标识号


标志


3位标志中第一位不使用, 第二位为DF(Don`t Fragment不分段)位, 如果该位为1, 并且传输的数据报超过最大传输单元(MTU), 则该数据报会被丢弃, 并发送一个ICMP差错报文; 第三位MF(More Fragment更多分段)位,表示是否有更多的分片, 如果该位为1, 则说明后续还有分片, 最后一片MF为0


片偏移


以8个字节为单位,指出该分段的第一个数据字在原始数据报中的偏移位置,IP分片后每一个分组都具有自己的首部, 而且标志位相同, 但是片偏移值不同, 通过片偏移值接收端可以重新组装IP包


生存时间(TTL)


表示数据报最多可经过的路由器点的数量. 取值0~255,每经过一个路由器, TTL值减1,为0时被丢弃, 并发送ICMP报文通知源主机, TTL可以避免数据报在路由器之间不断循环(Tranceroute程序的实现原理)


协议类型


指明IP层上承载的是哪个高级协议, 在封装与分用的过程中, 协议栈知道该交给哪个层的协议处理, 如1为ICMP, 2为IGMP, 6为TCP, 17为UDP等.


头部校验和


保证数据报头部的数据完整性,但校验不包括数据部分。这样做的目的有二:一是所有将数据封装在IP数据包中的高层协议均含有覆盖整个数据的校验和,因此IP数据报没有必要再对其所承载的数据部分进行校验。二是每经过一个路由器,IP数据报的头部要发生改变(如TTL),而数据部分不变,这样只对发生改变的头部进行校验,显然不会浪费太多的时间。为了减少计算时间,一般不用CRC校验码,而是采用更简单的网际校验和(Internet Checksum)。


选项与填充


(选项为4字节整数倍,否则用0填充)

安全和处理限制

路径记录:记录所经历路由器的IP地址

时间戳:记录所经历路由器的IP地址和时间

宽松源站路由:指定数据报文必须经历的IP地址,可以经过没有指定的IP地址。

严格的源站路由:指定数据报文必须经历的IP地址,不能经过没有指定的IP地址。

//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协议用于传递差错信息、时间、回显、网络信息等控制数据

当我们ping 一台主机想看它是否运行时,就产生了一条ICMP 信息。远程主机将用它自己的ICMP 信息对ping 请求作出回应。

ICMP协议说明:

ICMP数据包本身是IP的一部分,ICMP包含在IP数据包的净荷数据中,IP头中协议类型为1; 主要用于网关或者目标机器利用ICMP与源通讯,当出现问题时,提供反馈信息; ICMP数据的第一个字节代表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报文段


协议描述


源端口号和目的端口号


源和目的主机的IP地址加上端口号构成一个TCP连接


序号和确认号


序号为该TCP数据包的第一个字节在所发送的数据流中的偏移量;确认号为希望接收的下一个数据字的序号;


数据偏移(首部长度)


以4个字节为单位,通常为20个字节


6个标志位:


URG


如果使用了紧急指针,URG置1,紧急指针为当前序号到紧急数据位置的偏移量


ACK


为1表示确认号有效,为0表示该TCP数据包不包含确认信息


PSH


表示是带有PUSH标志的数据,接收到数据后不必等缓冲区满再发送


RST


用于连接复位,也可用于拒绝非法的数据或拒绝连接请求


SYN


用于建立连接,连接请求时SYN=1,ACK=0;响应连接请求时SYN=1,ACK=1


FIN


用于释放连接,表示发送方已经没有供发送的数据


窗口大小


表示在确认字节后还可以发送字节数,用于流量控制


校验和


覆盖了整个数据包,包括对数据包的首部和数据


选项


常见的选项是MSS(Maximum Segment Size, 最大报文长度)

连接建立三次握手

连接终止四次挥手

TCP如何保证可靠性

应用数据被分割成TCP认为最适合发送的数据块,称为TCP报文段传递给IP层。

当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。

TCP将保持它首部和数据的校验和。这是一个端到端的校验和,目的是检测数据在传输过程中的任何变化。如果收到段的校验和有差错,TCP将丢弃这个报文段并且不确认(导致对方超时重传);

TCP承载于IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对收到的数据进行重新排序。

IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。

TCP还能提供流量控制。TCP连接的每一方都有一定大小的缓冲空间。


端口分类


众所周知端口:从0到1023


这些端口由IANA分配和控制它们紧密绑定于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如:21为ftp服务端口


注册端口:从1024到49151


这些端口不受IANA控制,但由IANA登记并提供使用情况清单。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样可以用于许多其它目的。例如:1433 Microsoft SQL服务端口


临时端口:从49152到65535


IANA不管这些端口。实际上,机器通常从1024起分配动态端口(例外:SUN的RPC端口从32768开始)

综合:数据在网络中传输过程

步骤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包响应包。

其他更详细的关于TCP/IP计算机网络知识请参考博客:

http://blog.csdn.net/zjf280441589/article/category/1854365

时间: 2024-08-25 13:20:09

Socket编程实践(1) --TCP/IP简述的相关文章

Socket编程实践(17) --TCP/IP各层报文(2)

UDP数据报 UDP首部代码: struct udp_hdr { unsigned short src_port; unsigned short dest_port; unsigned short len; unsigned short chksum; }; TCP报文段 协议描述 源端口号和目的端口号:源和目的主机的IP地址加上端口号构成一个TCP连接 序号和确认号:序号为该TCP数据包的第一个数据字在所发送的数据流中的偏移量:确认号为希望接收的下一个数据字的序号: 首部长度,以4个字节为单位

Socket编程实践(16) --TCP/IP各层报文(1)

以太网帧格式 说明1:链路层的数据包,称为以太网帧. 说明2:链路层不识别IP地址[因为IP地址是逻辑地址],链路层识别物理网卡MAC地址[硬件地址]. 说明3:需要根据IP地址找到对方的MAC地址(ARP地址解析协议)[MAC -> IP地址方向地址解析:RARP反向地址解析协议]. 说明4:应用层根据对等方的IP地址进行通讯,在数据封装过程中,链路层需要目的地址的MAC地址从何而来?需要将IP地址转换成MAC地址,也就是地址解析. 以太网首部代码: struct ethernet_hdr {

Socket编程实践(6) --TCP服务端注意事项

僵尸进程处理 1)通过忽略SIGCHLD信号,避免僵尸进程 在server端代码中添加 signal(SIGCHLD, SIG_IGN); 2)通过wait/waitpid方法,解决僵尸进程 signal(SIGCHLD,onSignalCatch); void onSignalCatch(int signalNumber) { wait(NULL); } 3) 如果多个客户端同时关闭, 问题描述如下面两幅图所示: /** client端实现的测试代码**/ int main() { int s

Socket编程实践(6) --TCP粘包原因与解决

流协议与粘包 粘包的表现 Host A 发送数据给 Host B; 而Host B 接收数据的方式不确定 粘包产生的原因 说明 TCP 字节流,无边界 对等方,一次读操作,不能保证完全把消息读完 UDP 数据报,有边界 对方接受数据包的个数是不确定的 产生粘包问题的原因分析 1.SQ_SNDBUF 套接字本身有缓冲区 (发送缓冲区.接受缓冲区) 2.tcp传送的端 mss大小限制 3.链路层也有MTU大小限制,如果数据包大于>MTU要在IP层进行分片,导致消息分割. 4.tcp的流量控制和拥塞控

Socket编程实践(9) --TCP服务器常见问题(4)

TCP/IP协议的11种状态 说明: 1.如下图(客户端与服务器都在本机:双方(server的子进程,与client)链接已经建立(ESTABLISHED),等待通信) 2.最先调用close的一端,后面会进入TIME_WAIT的状态(下图,server端首先关闭) 3.TIME_WAIT 时间是2MSL(报文的最长存活周期的2倍)     原因:(ACK y+1)如果发送失败可以重发. 服务器端处于closed状态,不等于客户端也处于closed状态.. 4.TCP/IP协议的第1种状态:图上

Socket编程实践(5) --TCP粘包问题与解决

TCP粘包问题 因为TCP协议是基于字节流且无边界的传输协议, 因此非常有可能产生粘包问题, 问题描写叙述例如以下 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvempmMjgwNDQxNTg5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" /> 对于Host A 发送的M1与M2两个各10K的数据块, Host B 接收数据的方式不确定, 有以下

(转)iOS 各种网络编程总结--进程、线程、Socket、HTTP、TCP/IP、TCP和UDP

######################################################### 进程与线程 进程和线程都是由操作系统分配和调度的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性. 进程是一块包含了某些资源的内存区域.操作系统利用进程把它的工作划分为一些功能单元.进程中所包含的一个或多个执行单元称为线程(thread).进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更

Linux程序设计学习笔记----Socket网络编程基础之TCP/IP协议簇

转载请注明出处: ,谢谢! 内容提要 本节主要学习网络通信基础,主要涉及的内容是: TCP/IP协议簇基础:两个模型 IPv4协议基础:IP地址分类与表示,子网掩码等 IP地址转换:点分十进制\二进制 TCP/IP协议簇基础 OSI模型 我们知道计算机网络之中,有各种各样的设备,那么如何实现这些设备的通信呢? 显然是通过标准的通讯协议,但是,整个网络连接的过程相当复杂,包括硬件.软件数据封包与应用程序的互相链接等等,如果想要写一支将联网全部功能都串连在一块的程序,那么当某个小环节出现问题时,整只

Socket编程实践(6) --TCPNotes服务器

僵尸进程过程 1)通过忽略SIGCHLD信号,避免僵尸进程 在server端代码中加入 signal(SIGCHLD, SIG_IGN); 2)通过wait/waitpid方法.解决僵尸进程 signal(SIGCHLD,onSignalCatch); void onSignalCatch(int signalNumber) { wait(NULL); } 3) 假设多个客户端同一时候关闭, 问题描写叙述如以下两幅图所看到的: watermark/2/text/aHR0cDovL2Jsb2cuY