深入理解套接字

socket是一个接口,在用户进程与TCP/IP协议之间充当中间人,完成TCP/IP协议的书写,用户只需理解接口即可。

socket通信类比为打电话这一生活场景。这里我把TCP服务器比作政府某一服务部门能,TCP客户端比作企业中某一部门电话,描述这一过程,恰好就像是socket通信,服务部门提供服务,企业部门申请服务。

要实现通信,首先政府部门都必须申请一个电话(socket_fd),并向有关部门注册(我们的系统),提供地址(sockadrr)以及属于哪个部门的(port),录入系统后,就算是合约生效了(bind),于是乎,政府广而告之,这个服务热线就算开通了,在部门里面的人员所需要做的事情,就是等待企业家拨打热线(listen)。

企业家拨打电话对地点和部门没有这么多的要求了,他并不需要绑定地址和部门,在任何一个可以拨打电话的地方(可能是同个部门,也可以同公司不同部门,甚至可能是竞争对手),他只需要拿起一个已经注册的电话(socket_fd),拨打电话(connect)

政府部门接通电话(accept)后,桥梁就打通了(服务者client_fd、顾客server_fd),可以进行听说了(read write)。企业家咨询完成(close),政府到点下班关闭服务(close)

创建套接字流程。

 

 

   socket():创建套接字。

domain:即协议域,又称为协议族(family)。

常用的地址族有:

AF_INET

AF_INET6

AF_LOCAL(AF_UNIX,本地通信用)

AF_ROUTE

协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。

type:信息传送方式。

SOCK_STREAM

SOCK_DGRAM

SOCK_RAW

SOCK_PACKET

SOCK_SEQPACKET

protocol:对应协议。

IPPROTO_TCP TCP传输协议

IPPTOTO_UDP UDP传输协议

IPPROTO_SCTP STCP传输协议

IPPROTO_TIPCTIPC传输协议

通常设置为0,让其自动匹配。

domain 网络层相关协议 type 信息传送方式 protocol 运输层相关协议,如果前两个都确定了,系统就可以自动选择协议了。

bind():指定本地地址。一个套接字用socket()创建后,它其实还没有与任何特定的本地或目的地址相关联。在很多情况下,应用程序并不关心它们使用的本地地址,这时就可以不用调用bind指定本地的地址,而由协议软件为它们选择一个。但是,在某个知名端口(Well-known Port)上操作的服务器进程必须要对系统指定本地端口。所以一旦创建了一个套接字,服务器就必须使用bind()系统调用为套接字建立一个本地地址。

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

 

connect():将套接字连接到目的地址。初始创建的套接字并未与任何外地目的地址关联。客户机可以调用connect()为套接字绑定一个永久的目的地址,将它置于已连接状态。对数据流方式的套接字,必须在传输数据前,调用connect()构造一个与目的地的TCP连接,并在不能构造连接时返回一个差错代码。如果是数据报方式,则不是必须在传输数据前调用connect。如果调用了connect(),也并不像数据流方式那样发送请求建连的报文,而是只在本地存储目的地址,以后该socket上发送的所有数据都送往这个地址,程序员就可以免去为每一次发送数据都指定目的地址的麻烦。

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

listen():设置等待连接状态。对于一个服务器的程序,当申请到套接字,并调用bind()与本地地址绑定后,就应该等待某个客户机的程序来要求连接。listen()就是把一个套接字设置为这种状态的函数。

int listen(int sockfd, int backlog);

accept():接受连接请求。服务器进程使用系统调用socketbindlisten创建一个套接字,将它绑定到知名的端口,并指定连接请求的队列长度。然后,服务器调用accept进入等待状态,直到到达一个连接请求。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

send()/recv()sendto()/recvfrom():发送和接收数据 。在数据流方式中,一个连接建立以后,或者在数据报方式下,调用了connect()进行了套接字与目的地址的绑定后,就可以调用send()reev()函数进行数据传输。

ssize_t read(int fd, void *buf, size_t count);

 ssize_t write(int fd, const void *buf, size_t count);

 

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

 

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,

              const struct sockaddr *dest_addr, socklen_t addrlen);

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,

                struct sockaddr *src_addr, socklen_t *addrlen);

 

ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

closesocket():关闭套接字

int close(int fd);

网络编程

ISP(Internet Service Provider),互联网服务提供商,即向广大用户综合提供互联网接入业务、信息业务和增值业务的电信运营商。ISP是经国家主管部门批准的正式运营企业,享受国家法律保护。

Tcp/ip协议(传输控制协议/互联网协议)不是简单的一个协议,而是一组特别的协议

协议 :语言,约定好的说明

局域网:局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享工作组内的日程安排、电子邮件和传真通信服务等功能。局域网是封闭型的,可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。

广域网:广域网(英语:Wide Area Network,缩写为 WAN),又称广域网外网公网。是连接不同地区局域网城域网计算机通信的远程网。通常跨接很大的物理范围,所覆盖的范围从几十公里到几千公里,它能连接多个地区、城市和国家,或横跨几个洲并能提供远距离通信,形成国际性的远程网络。广域网并不等同于互联网

包:(packet)将大数据分为一个叫包的最小单位

在包交换网络里,单个消息被划分为多个数据块,这些数据块称为包,它包含发送者和接收者的地址信息。这些包然后沿着不同的路径在一个或多个网络中传输,并且在目的地重新组合

IP地址:由网络标识和主机标识两部分组成

MAC地址 :MAC(Media Access Control,介质访问控制)地址,或称为MAC位址、硬件地址,用来定义网络设备的位置。MAC集成在网卡,由48bit的2进制的数字组成,0~23位数字叫作组织唯一标志符(organizationally unique,是识别局域网节点的标识)。24~47位是由厂家自己分配,其中第48位是组播地址标志位。网卡的物理地址通常是由网卡生产厂家写入网卡的EPROM芯片中,芯片中的数据可以通过程序进行擦写,它存储的是传输数据时真正赖以标识发出数据的电脑和接收数据的主机的地址。也就是说,在网络底层的物理传输过程中,数据传输是通过物理地址来识别主机的,它一定是全球唯一的

交换机:交换机能同时连通许多对端口,使每一对相互通信的主机都能像独占通信媒体那样,进行无冲突地传输数据。

子网掩码(subnet mask)又叫网络掩码地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址主机地址两部分。

 

Osi分层处理  tcp/ip分层模型

应用层

表示层应用层应用程序

会话层

---------------------------------------------------------------------------------------------

传输层传输层操作系统

网络层互联网层

--------------------------------------------------------------------------------------------------------------

数据链路层网卡层设备驱动程序和网络接口

物理层硬件

应用层(Application Layer):该层为用于通信的应用程序和用于消息传输的底层网络提供接口。其作用是在实现多个系统应用进程相互通信的同时,完成一系列业务处理所需的服务.其服务元素分为两类:公共应用服务元素CASE和特定应用服务元素SASE.

表示层它的主要作用之一是为异种机通信提供一种公共语言,以便能进行互操作。这种类型的服务之所以需要,是因为不同的计算机体系结构使用的数据表示法不同。与第五层提供透明的数据运输不同,表示层是处理所有与数据表示及运输有关的问题,包括转换、加密和压缩。每台计算机可能有它自己的表示数据的内部方法,例如,ASCII码与EBCDIC码,所以需要表示层协定来保证不同的计算机可以彼此理解。

网络层其功能为“传送”,即通过通信网络进行信息传输。网络层作为纽带连接着感知层和应用层,它由各种私有网络、互联网、有线和无线通信网等组成,相当于人的神经中枢系统,负责将感知层获取的信息,安全可靠地传输到应用层,然后根据不同的应用需求进行信息处理相当于导航,寻找最短路径。

会话层“对话和交谈”。面对应用进程提供分布处理,对话管理,信息表示,恢复最后的差错等. 会话层同样要担负应用进程服务要求,而运输层不能完成的那部分工作,给运输层功能差距以弥补.主要的功能是对话管理,数据流同步和重新同步。

建立联系—》传输数据—》连接释放

 

传输层主要负责向两个主机中进程之间的通信提供服务。由于一个主机同时运行多个进程,因此运输层具有有复用和分用功能。传输层在终端用户之间提供透明的数据传输,向上层提供可靠的数据传输服务。传输层在给定的链路上通过流量控制、分段/重组和差错控制来保证数据传输的可靠性。传输层的一些协议是面向链接的,这就意味着传输层能保持对分段的跟踪,并且重传那些失败的分段。

数据链路层定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。数据链路层必须具备一系列相应的功能,主要有:如何将数据组合成数据块,在数据链路层中称这种数据块为,帧是数据链路层的传送单位;如何控制帧在物理信道上的传输,包括如何处理传输差错,如何调节发送速率以使与接收方相匹配;以及在两个网络实体之间提供数据链路通路的建立、维持和释放的管理。

数据链路(逻辑线路):在一条物理线路之上,通过一些规程或协议来控制这些数据的传输,以保证被传输数据的正确性。实现这些规程或协议的硬件和软件加到物理线路,这样就构成了数据链路,从数据发送点到数据接收点所经过的传输途径。当采用复用技术时,一条物理链路上可以有多条数据链路。

物理链路(物理线路):是由传输介质与设备组成的。原始的物理传输线路是指没有采用高层差错控制的基本的物理传输介质与设备。

物理层信号介质”。 为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境。为传输数据所需要的物理链路创建、维持、拆除,而提供具有机械的,电子的,功能的和规范的特性。

 

 

传输层及其以下的机制由内核提供,是操作系统的一部分,应⽤层由⽤户进程提供应⽤层数据通过协议栈发到⽹络上时,每层协议都要加上⼀个数据⾸部(header),称为封装。不同的协议层对数据包有不同的称谓,在传输层叫做(segment),在⽹络层叫做数据报(datagram),在链路层叫做(frame)

帧协议:

♦源地址和⽬的地址是指⽹卡的硬件地址(也叫MAC地址),长度是48位,是在⽹卡出⼚时固化的。Linux下可以⽤ifconfig命令看⼀下,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。

♦ 帧协议类型字段有三种值,分别对应IP、 ARP、 RARP。

♦ 帧末尾是CRC校验码。

♦数据长度规定最⼩46字节,最⼤1500字节,ARP和RARP数据包的长度不够46 字节,要在后⾯补填充位。

最⼤值1500称为以太⽹的最⼤传输单元(MTU),不同的⽹络类型有不同的MTU,如果⼀个数据包从以太⽹路由到拨号链路上,数据包长度⼤于拨号链路的MTU了,则需要对数据包进⾏分⽚。 ifconfig命令的输出中也有“MTU:1500”。注 意,MTU这 个概念指数据帧中有效载荷的最⼤长度,不包括帧⾸部的长度

IP数据报格式

 

♦4 位版本号指定 IP 协议的版本。对 IPv4 来说,其值是 4;

♦4 位头部长度标识该 IP 头部有多少个 32 bit字(4 字节 ),最⼩值为5,也就是说⾸部长度最⼩是4x5=20字节, 也就是不带任何选项的IP⾸部,4位能表⽰的最⼤值是15,也就是说⾸部长度最⼤是60字 节。

 ♦8位TOS字段有3个位⽤来指定IP数据报的优先级(⽬前已经废弃不⽤),还有4个位表⽰可选的服务类型(最⼩延迟、最⼤呑吐量、最⼤可靠性、最⼩成本),还有⼀个位总 是0。

♦16位总长度是整个数据报(包括IP⾸部和IP层payload)的字节数,以字节为单位,因 此 IP 数据报的最大长度为 65535 (2,6-1 ) 字节。但由于MTU的限制, 长度超过 MTU的数据报都将被分片传输,所以实际传输的 IP 数据报 (或分片)的长度都远远没有达到最大值。 

♦16位标识唯一地标识主机发送的每一个数据报。初始值由系统随机生成 :每发送一个数据报,其值就加1。该值在数据报分片时被复制到每个分片中,因此同一个数据报的所有分片都具有相同的标识值。

♦3 位标志字段的第一位保留。第二位表 示“ 禁止分片”。如果设S 了这个位,IP 模块将不对数据报进行分片。在这种情况下,如 果 1P数据报 K 度 超 过 MTU的话, IP 模块将丢弃该数据报并返回一个丨CMP差错报文 。第 三 位及 示 “ 更多分片 ”。除了数据报的最后一个分片外,其他分片都要把它置1。

♦13位分片偏移是分片相对原始丨P 数据报开始处 (仅指数据部分 )的偏移。实际的偏移值是该值左移3 位(乘 8 ) 后得到的。由于这个原因,除了最后一个丨P 分片外,每 个 IP 分片的数据部分的长度必须垃8 的整数倍 (这样才能保证后面的 1P分片拥有一个合适的偏移侦)。

♦8 位生存时间 (Time To Live, T T L) 是数据报到达目的地之前允许经过的路rfl器跳数。TTL值被发送端设置 (常见的值记 64)。数据报在转发过程中每经过一个路由,该值就被路由器减 1。当 TTL值减为 0时 ,路由器将丢弃数据报,并向源端发送一个 ICMP 差错报文aTTL值可以防止数据报陷入路由循环。

♦8 位协议用来区分上层协议,/etc/prmocols 文件定义了所有上层协议对应的 protocol字段的数值。其中 ICMP是 1,TCP是 6, UDP是 17。 /etc/protocols文件是 RFC 1700的一个子集。

♦16位头部校验和由发送端填充,接收端对其使用 CRC 算法以检验IP 数据报头部(注意,仅检验头部)在传输过程中是否损坏。

♦32位的源端 IP 地址和目的端 IP 地址用来标识数据报的发送端和接收端 。—般情况下,这两个地址在整个数据报的传递过程中保持不变,而不论它中间经过多少个中转路由器。♦选项字段是可变长的可选信息 。这部分最多包含40字节 ,因为丨P头部最长是 60 字节(其中还包含前面讨论的 20 字节的同定部分)。可用的 IP 选项包括:记录路由、时间戳、松散路由源路由选择、严格源路由选择

 

 

 

 

 

Tcp/ip

通信过程

网络通信的过程中,将发出数据的主机称为源主机,接收数据的主机称为目的主机。当源主机发出数据时,数据在源主机中从上层向下层传送。源主机中的应用进程先将数据交给应用层,应用层加上必要的控制信息就成了报文流,向下传给传输层。传输层将收到的数据单元加上本层的控制信息,形成报文段、数据报,再交给网际层。网际层加上本层的控制信息,形成IP数据报,传给网络接口层。网络接口层将网际层交下来的IP数据报组装成帧,并以比特流的形式传给网络硬件(即物理层),数据就离开源主机。

通过网络传输,数据到达目的主机后,按照与源主机相反的过程,在目的主机中从下层向上层进行拆包传送。首先由网络接口层接收数据,依次剥离原来加上的控制信息,最后将源主机中的应用进程发送的数据交给目的主机的应用进程。

TCP/IP协议的基本传输单位是数据报Datagram),TCP协议负责把数据分成若干个数据报,并给每个数据报加上报头,报头上有编号,以保证目的主机能将数据还原为原来的格式。IP协议在每个报头上再加上接收端主机IP地址,这样数据能找到自己要去的地方。如果传输过程中出现数据失真、数据丢失等情况,TCP协议会自动请求重新传输数据,并重组数据报。可以说,IP协议保证数据的传输,TCP协议保证数据传输的质量。

TCP/IP协议数据在传输时每通过一层就要在数据上加个报头,其中的数据供接收端同一层协议使用,而在接收端,每经过一层要把用过的报头去掉,这样可以保证传输数据的一致性

核心协议

一、IP协议

网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。

IP层接收由更低层(网络接口层,例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层——TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。

高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IPsource routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好像是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平时是被禁止的连接。因此,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。

二、TCP协议

如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向“上”传送到TCP层。

TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。

TCP将它的信息送到更高层的应用程序,例如,Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。

面向连接的服务(例如Telnet、FTP、rlogin、XWindows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。

三、UDP协议

UDP与TCP位于同一层,但对于数据包的顺序错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询一应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网络时间协议)和DNS(DNS也使用TCP)。

欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。

四、ICMP协议

ICMP与IP位于同一层,它被用来传送IP的控制信息。它主要是用来提供有关通向目的地址的路径信息。ICMP的“Redirect”信息通知主机通向其他系统的更准确的路径,而“Unreachable”信息则指出路径有问题。另外,如果路径不可用了,ICMP可以使TCP连接“体面地”终止。PING是最常用的基于ICMP的服务

特点

TCP/IP协议能够迅速发展起来并成为事实上的标准,是它恰好适应了世界范围内数据通信的需要。它有以下特点:

1)协议标准是完全开放的,可以供用户免费使用,并且独立于特定的计算机硬件操作系统

2)独立于网络硬件系统,可以运行在广域网,更适合于互联网

3)网络地址统一分配,网络中每一设备和终端都具有一个唯一地址。

4)高层协议标准化,可以提供多种多样可靠网络服务

缺陷

OSl模型一样,TCP/IP模型和协议也有自己的问题。

1)该模型没有明显地区分服务、接口和协议的概念。好的软件工程实践要求概念规范,这一点OSl非常小心地进行了处理,而TCP/IP模型就做得不够。因此,对于使用新技术来设计新网络,TCP/IP模型不是一个太好的模板。

2)TCP/IP模型完全不是通用的,并且不适合描述除TCP/IP模型之外的任何协议栈。例如,试图用TCP/IP模型描述IBM网络体系结构SNA几乎是不可能的。

3)网络接口层在分层协议中根本不是通常意义下的层。它是一个接口,处于互连层和数据链路层之间。接口和层间的区别是很关键的,不能粗心大意。

4)TCP/IP模型不区分(甚至不提及)物理层和数据链路层。这两层完全不同,物理层必须处理铜缆、光纤和无线通信的传输特点:而数据链路层的工作是区分帧头和帧尾,并且以通信需要的可靠性把帧从一端发送到另一端。好的模型应把它们作为分离的层,而TCP/IP模型并没有这么做。

5)虽然TCP和IP协议被仔细地设计并且很好地实现了,但还有许多其他协议未曾良好实现就被免费发送并被大量应用,因此很难被替换,到现在出现了一些难堪的情况。例如,虚拟终端协议Telnet被设计用于10字符每秒的机械式电传终端,但是25年以后,它们仍在广泛使用。

OSI模型(去掉会话层和表示层)对于讨论计算机网络特别有用,但是OSI协议并未流行:TCP/IP协议正好相反,模型实际上不存在,但协议被广泛使用

 

 

 

 

 

posted @ 2020-09-04 18:35  特权E5  阅读(379)  评论(0编辑  收藏  举报