UNIX网络编程笔记

来源:互联网 发布:windows mfc图形编程 编辑:程序博客网 时间:2024/06/08 22:12







TCP IP是内核协议栈的一部分

sockaddr_in:网际套接口地址结构

struct sockaddr:通用套接口地址结构

从TCP套接口度数据时,总是把read放在某个循环中,当read返回0(远程端关闭连接)或负值(错误发生时)终止循环


计算机网络各层对等实体间交换的单位信息称为协议数据单元(PDU)

应用层:TCP(数据data)UDP(记录record)

TCP:分节segment   UDP:数据报datagram  TCP应用进程的数据由TCP划分成块chunk后封装在分节中传送

网络层:分组packet  分组如果超过链路层单个PDU大小,将会划分为片段fragment

链路层:帧frame


每层的PDU出用来封装来自上层的数据单元(服务数据单元SDU),也用于本层内部的协议通信(如SYN FIN)

MSS:应用层与传输层之间的接口属性 MTU网络层与数据链路层之间的接口属性

FTP(21)和SMTP(25)协议都使用回车和换行构成的2字节序列终止记录

Unix errno 每当在一个Unix函数中发生错误时,全局变量errno将被设置成一个指示错误类型的正数,函数本身则同城返回-1

errno不适合共享所有全局变量的多线程。 LINUX中errno是线程安全的 


TCP/IP是个协议族 包括: IPV4 IPV6 TCP UDP ICMP IGMP ARP RARP ICMPv6 BPF DLPI

TCP 数次重传失败后 才放弃,重传数据所花的总时间传统上是4~10分钟。TCP含有用于动态估算客户到服务器往返所花时间(RTT)的算法,局域网内RTT大约为几毫秒,跨越广域网大概为几秒。

TCP提供流量控制。TCP总是告诉对方它能够接收多少字节的数据,这称为通告窗口。任何时刻,这个窗口指出接收缓冲区中的可用空间

TCP是全双工的


建立一个TCP连接

三路握手

1.服务器准备好接受外来的连接。通过socket bind listen函数来完成,称为被动打开(passive open)

2.客户通过调用connect进行主动打开(active open)。这引起客户TCP发送一个SYN分节(表示同步),它概述服务器将在(待建立)连接中发送的数据的厨师序列号,一般情况下SYN分节不携带数据,只有一个IP头部,一个TCP头部和可能有的TCP选项

3.服务器必须确认客户的SYN,同时自己也得发送一个SYN分节,包括服务器将在同一连接中发送数据的初始序列号。服务器以单个分节向客户发送SYN和对客户SYN的ACK

4.客户必须确认服务器的SYN


TCP选项

每一个SYN可以含有若干个TCP选项

1.MSS(maximum segment size)选项 通知对方它的最大分节大小 通过TCP_MAMSEG获取与设置

2.窗口规模选项 TCP双方能通知对方的最大窗口大小是65535,因为TCP头部相应你的字段只占16位。SO_RECVBUF影响该选项

3.时间戳选项


TCP连接终止

终止一个连接需要4个分节

1.某个应用进程首先调用close,称为主动关闭(active close),这一端的TCP于是发送一个FIN分节,表示数据发送完毕

2.接收到FIN的另一端执行被动关闭(passive close)。这个FIN由TCP确认。它的接收也作为文件结束符给接收方应用进程(放在已排队等候该应用进程接收的任何其他数据值后),因为FIN的接收,意味着应用在相应连接上再也接收不到额外数据。

3.一段时间后,接收在文件结束符的应用进程将调用close关闭它的套接口。这导致它的TCP也发送一个FIN

4.接收到这个FIN的原发送方TCP对他进行确认



TIME_WAIT状态

执行主动关闭的一段进入TIME_WAIT状态,该状态的持续时间为最长分节生命期MSL(max segment lifetime)的两倍,有时称为2MSL

每个TCP实现都必须选择一个MSL,RFC1122是建议值是2分钟。Berkeley的实现传统上是30s。MSL是IP数据能在互联网上生存的最长时间。这个时间是有限的,应为每一个数据报有一个8位的字段称为跳限,最大值为255.尽管这是一个条数限制而不是真正的时间限制,仍需假设:具有最大跳限(255)的分组那个超过MSL秒还存在

分组在路由异常时经常迷途。某个路由器奔溃或两个路由之间的链路断开时,路由协议需花数秒或数分钟才能稳定并找出另一条通路,这段时间有可能产生路由循环,吃屎分组可能就陷入这样的循环。在此期间,假设迷途的分组是一个TCP分节,发送放TCP超时并重传该分组,重传的分组最终选择另一条路径到达目的地。但是不久之后路由循环修复,迷失在循环中的分组也到达目的地。这个原来的分组称为迷途的重复分组或漫游的重复分组,与之相对的重复分组就是超时重传分组。TCP必须正确处理这种重复的分组

存在TIME_WAIT状态有两个理由:

1.实现终止TCP全双攻连接的可靠性

如果关闭连接时有分节丢失,有时间重发FIN对应的ACK

2.允许老的重复分节在网络中消逝

TCP不能给处于TIME_WAIT状态的连接启动新的化身,在2MSL时间内,上一个老的重复分组已经在网络中消逝。


保留端口 0~1023 只能分配给超级用户的socket

1024~49151 已经注册的端口

49152~65535 动态或是有的端口


缓冲区大小及限制

IPv4数据报的最大大小是65535字节,包括40字节的IPv4头部 IPv6数据包的最大大小为65575字节
很多网络有一个最大传输单元MTU,它由硬件规定,例如以太网的MTU为1500字节,IPv4要求的 最小MTU为68字节,IPv6为576字节

当一个IP数据报将从某个接口发过出时,如果它的大小相应链路的MTU,IPv4和IPv6都将执行分片(fragmentation)。个片段到达目的地前不会被重组。IPv4逐级对其产生的数据报执行分片,IPv4路由器对其转发的数据报也执行分片,但IPv6只在数据报产生的主机执行分片,路由器不执行分片(IPv6路由器可以分片,但仅限于由路由器产生的数据报而不是转发的数据报,这是路由器实际上作为主机运行)对应

IPv4和IPv6定义了最小重组缓冲区大小:任何实现都必须支持的最小数据报大小,对IPv4其值为576字节,对IPv6是1500字节。对于IPv4来说,不能确信给定的目的主机是否能够接受577字节的数据报,所以很多使用UDP的应用程序避免产生大于这个大小的数据报

TCP有一个MSS,用于向对方TCP通告对方在每个分节中能发送的最大TCP数据量。MSS的目的是告诉对方其其重组缓冲区大小的 实际值,从而避免分片。MSS经常设置为MTU减去IP和TCP头部的固定长度。在以太网中使用IPv4的MSS为1460,使用IPv6的值为1440


同步IO与异步IO

Posix定义这两个属于如下:

同步IO操作引起请求进程阻塞,直到IO操作完成

异步IO操作不引起进程阻塞



0 0
原创粉丝点击