README.md 5.65 KB
Newer Older
1 2 3
go-tcp-transport
==================

Yusef Napora's avatar
Yusef Napora committed
4 5 6 7
[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai)
[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io/)
[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p)
[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io)
8
[![Coverage Status](https://coveralls.io/repos/github/libp2p/go-tcp-transport/badge.svg?branch=master)](https://coveralls.io/github/libp2p/go-tcp-transport?branch=master)
9
[![Travis CI](https://travis-ci.com/libp2p/go-tcp-transport.svg?branch=master)](https://travis-ci.com/libp2p/go-tcp-transport)
10 11 12

> A libp2p transport implementation for tcp, including reuseport socket options.

13 14 15
`go-tcp-transport` is an implementation of the [libp2p transport
interface][concept-transport] that streams data over TCP/IP sockets. It is
included by default in the main [`go-libp2p`][go-libp2p] "entry point" module.
16 17 18

## Table of Contents

19 20 21 22 23 24 25 26
- [go-tcp-transport](#go-tcp-transport)
    - [Table of Contents](#table-of-contents)
    - [Install](#install)
    - [Usage](#usage)
    - [Security and Multiplexing](#security-and-multiplexing)
    - [reuseport](#reuseport)
    - [Contribute](#contribute)
    - [License](#license)
27 28 29

## Install

30 31 32 33 34 35 36 37
`go-tcp-transport` is included as a dependency of `go-libp2p`, which is the most
common libp2p entry point. If you depend on `go-libp2p`, there is generally no
need to explicitly depend on this module.

`go-tcp-transport` is a standard Go module which can be installed with:

``` sh
go get github.com/libp2p/go-tcp-transport
38 39
```

40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

This repo is [gomod](https://github.com/golang/go/wiki/Modules)-compatible, and users of
go 1.11 and later with modules enabled will automatically pull the latest tagged release
by referencing this package. Upgrades to future releases can be managed using `go get`,
or by editing your `go.mod` file as [described by the gomod documentation](https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies).

## Usage

TCP is one of the default transports enabled when constructing a standard libp2p
Host, along with [WebSockets](https://github.com/libp2p/go-ws-transport).

Calling [`libp2p.New`][godoc-libp2p-new] to construct a libp2p Host will enable
the TCP transport, unless you override the default transports by passing in
`Options` to `libp2p.New`.

To explicitly enable the TCP transport while constructing a host, use the
`libp2p.Transport` option, passing in the `NewTCPTransport` constructor function:

``` go

import (
Yusef Napora's avatar
Yusef Napora committed
61
    "context"
62

Yusef Napora's avatar
Yusef Napora committed
63
    libp2p "github.com/libp2p/go-libp2p"
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
    tcp "github.com/libp2p/go-tcp-transport"
)

ctx := context.Background()

// TCP only:
h, err := libp2p.New(ctx,
    libp2p.Transport(tcp.NewTCPTransport)
)
```

The example above will replace the default transports with a single TCP
transport. To add multiple tranports, use `ChainOptions`:

``` go
// TCP and QUIC:
h, err := libp2p.New(ctx,
Yusef Napora's avatar
Yusef Napora committed
81 82 83
    libp2p.ChainOptions(
        libp2p.Transport(tcp.NewTCPTransport),
        libp2p.Transport(quic.NewTransport)) // see https://github.com/libp2p/go-libp2p-quic-transport
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
)
```

## Addresses

The TCP transport supports [multiaddrs][multiaddr] that contain a `tcp`
component, provided that there is sufficient addressing information for the IP
layer of the connection.

Examples:

| addr                       | description                                        |
|----------------------------|----------------------------------------------------|
| `/ip4/1.2.3.4/tcp/1234`    | IPv4: 1.2.3.4, TCP port 1234                       |
| `/ip6/::1/tcp/1234`        | IPv6 loopback, TCP port 1234                       |
| `/dns4/example.com/tcp/80` | DNS over IPv4, hostname `example.com`, TCP port 80 |


Support for IP layer protocols is provided by the
[go-multiaddr-net](https://github.com/multiformats/go-multiaddr-net) module.

## Security and Multiplexing

Because TCP lacks native connection security and stream multiplexing facilities,
the TCP transport uses a [transport upgrader][transport-upgrader] to provide
those features. The transport upgrader negotiates transport security and
multiplexing for each connection according to the protocols supported by each
party.

## reuseport

The [`SO_REUSEPORT`][explain-reuseport] socket option allows multiple processes
or threads to bind to the same TCP port, provided that all of them set the
socket option. This has some performance benefits, and it can potentially assist
in NAT traversal by only requiring one port to be accessible for many
connections.

The reuseport functionality is provided by a seperate module,
Yusef Napora's avatar
Yusef Napora committed
122 123
[go-reuseport-transport](https://github.com/libp2p/go-reuseport-transport). It
is enabled by default, but can be disabled at runtime by setting the
124 125
`LIBP2P_TCP_REUSEPORT` environment variable to `false` or `0`.

126 127 128 129 130 131 132 133 134
## Contribute

PRs are welcome!

Small note: If editing the Readme, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification.

## License

MIT © Jeromy Johnson
135 136 137 138

---

The last gx published version of this module was: 2.0.28: QmTGiDkw4eeKq31wwpQRk5GwWiReaxrcTQLuCCLWgfKo5M
139 140 141 142 143 144 145 146 147

<!-- reference links -->
[go-libp2p]: https://github.com/libp2p/go-libp2p
[concept-transport]: https://docs.libp2p.io/concepts/transport/
[interface-host]: https://github.com/libp2p/go-libp2p-core/blob/master/host/host.go
[godoc-libp2p-new]: https://godoc.org/github.com/libp2p/go-libp2p#New
[transport-upgrader]: https://github.com/libp2p/go-libp2p-transport-upgrader
[explain-reuseport]: https://lwn.net/Articles/542629/
[multiaddr]: https://github.com/multiformats/multiaddr