UNP——第二章,端口号,套接字对,TCP,UDP输出
1.端口号
端口号用于区分使用相同协议的进程。
TCP69 与 UDP69 是不同的。
端口号范围 0 - 65535, 其中 0- 1023 是保留端口。
2.套接字对
TCP服务通过套接字对,唯一识别进程。

如上,服务器fork后,两个子进程都 bind 了 12.106.32.254:21,那么TCP服务收到对端的数据包,应该给哪个进程呢?
所以套接字对才是数据收发的唯一表示,两个套接字对,是连接的唯一标识。
3.TCP输出

如上,TCP是带缓存的。
(1)应用程序调用 write,数据只是拷贝到TCP缓存,如果缓存空间不足,write会阻塞(若设置非阻塞,会直接返回),直到所有数据传到 TCP缓存。
所以write返回后,并不表示数据传到了对端,只是写入了TCP缓存。
(2)TCP缓存的大小可以用 SO_SNDBUF 设置
(3)TCP如何处理缓存数据?
TCP会按照MSS进行分节,并保留副本,并传递给IP层,IP层会打包分组,传到链路层,链路层按照MTU生成帧,传到物理层。
这里:
MSS <= MTU - 20(TCP首部字节数) - 20(IP首部字节数)
是设置MSS的推荐方法,原因是避免MTU分组
(4)TCP会等待对端的ACK,收到ACK,就将缓存对应分节释放,若没收到,要超时重传
(5)TCP的分节最终会到链路层的输出队列,若输出队列已满,链路层会丢弃分组,并使用协议栈向上报错,TCP会注意这个错误,并在某个时刻重传分节。
上面操作,应用无需关心。
3.UDP输出

如上,UDP分组是没有缓存的。因为UDP不可靠,所以不需要保存数据副本。
(1)UDP可以使用SO_SNDBUF设置UDP数据报的大小上线,如果应用传入的数据超出上线,内核向进程返回错误EMSGSIZE。
(2)应用写的数据,实际上是写入内核缓存,缓存的数据传入链路层输出队列,就直接丢弃。
(3)如果链路层输出队列满了,会丢弃UDP的数据,并向上报错,内核会返回ENOBUFS错误给进程。
(4)UDP无法设置MSS,由于MTU的缘故,写入大数据时,会造成比TCP更多的分片。
UNP——第二章,端口号,套接字对,TCP,UDP输出的更多相关文章
- day29 python 套接字socket TCP udp 形式发送信息的区别
我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket起源于UNIX,在 ...
- Socket(套接字) IP TCP UDP HTTP
Socket(套接字) 阮老师的微博 (转)什么是套接字(Socket)? 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进 ...
- 网络编程 套接字socket TCP UDP
网络编程与套接字 网络编程 网络编程是什么: 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 编写基于网络的应用程序的过程序称之为网络编程. 网络编程最主要的工 ...
- Linux网络通信编程(套接字模型TCP\UDP与IO多路复用模型select\poll\epoll)
Linux下测试代码: http://www.linuxhowtos.org/C_C++/socket.htm TCP模型 //TCPClient.c #include<string.h> ...
- python套接字解决tcp粘包问题
python套接字解决tcp粘包问题 目录 什么是粘包 演示粘包现象 解决粘包 实际应用 什么是粘包 首先只有tcp有粘包现象,udp没有粘包 socket收发消息的原理 发送端可以是一K一K地发送数 ...
- C++网络套接字编程TCP和UDP实例
原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1. 创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1) 创建套接字(so ...
- Day9 基于TCP的套接字和基于UDP的套接字
服务端: ss=socket() #创建服务器套接字 ss.bind() #把地址绑定到套接字 ss.listen() #监听套接字, inf_loop: #服务器无限循环 cs=ss.accept( ...
- UNP——第二章,常见协议概述
1.为什么要了解协议 程序员与协议合作,完成应用. 了解协议是为了了解协议完成了什么,提供了什么服务,自己还应该做什么. 2.从协议的角度,套接字是什么 套接字是协议的接口, IP套接字,代表可使用I ...
- linux网络环境下socket套接字编程(UDP文件传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
随机推荐
- 【Curl】【转】curl用法!
curl基础用法! www.ruanyifeng.com/blog/2019/09/curl-reference.html
- 【UR #13】Yist
UOJ小清新题表 题目摘要 UOJ链接 给出一个排列 \(A\) 以及它的一个非空子序列 \(B\),给出一个 \(x\) 并进行若干次操作,每一次操作需要在 \(A\) 中选择一个长度恰好为 \(x ...
- npoi 设置单元格格式
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- python 安装matplotlib
下载minianaconda 安装 进入cmd下 conda create --name python37 python=3.7 创建python3.7环境 conda activate pytho ...
- 从零开始针对 .NET 应用的 DevOps 运营实践 - Jenkins & SonarQube 安装配置
一.Overview 继续 DevOps 实施的相关内容,在上一篇的博客中,完成了对于工具链中使用到的软件所需的运行环境的配置,在这一篇的博客中,将聚焦于我们使用到的两个主要的软件:Jenkins 与 ...
- Linux系统安装MySQL(2020最新最详细)
2020最新Linux系统发行版ContOS7演示安装MySQL. 为防止操作权限不足,建议切换root用户,当然如果你对Linux命令熟悉,能够自主完成权限更新操作,可以不考虑此推荐. 更多命令学习 ...
- Helium文档8-WebUI自动化-wait_until等待元素出现
前言 wait_until等待某个条件为真才继续往下执行.默认的超时时间为10s,每0.5查询一次,这俩参数选填.可以设置超时时间和轮询间隔. 可以作为添加后校验元素是否存在的场景 入参介绍 def ...
- 【Azure DevOps系列】Azure DevOps使用Docker将.NET应用程序部署在云服务器
Docker持续集成 本章我们要实现的是通过我们往代码仓库push代码后,我们将每次的push进行一次docker自动化打包发布到docker hub中,发布到之后我将进行部署环节,我们将通过ssh方 ...
- 国内npm镜像源设置
淘宝npm镜像 搜索地址:http://npm.taobao.org/ registry地址:http://registry.npm.taobao.org/ cnpmjs镜像 搜索地址:http:// ...
- ansible-palybooks
ansible-playbooks 如果用模块形式一般有幂等性,如果用shell或者command没有幂等性 playbooks相当于是shell脚本,可以把要执行的任务写到文件当中,一次执行,方便调 ...