일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- airflow
- Python
- kubernetes
- JavaScript
- CSV
- tcp
- docker
- kubectl
- MAC address
- grafana
- java
- CVAT
- ip
- PostgreSQL
- Kafka
- log
- Packet
- aws s3
- Vision
- Network
- AWS
- helm
- zookeeper
- OS
- EC2
- Operating System
- Spring
- jvm
- kubeadm
- Trino
- Today
- Total
JUST WRITE
TCP 본문
TCP
Transmission Control Protocol
TCP는 Application에서 Data를 교환하게 해주는 Network 방식의 표준이다.
TCP는 IP(Internet Protocol)과 함께 Computer 간 Packet를 주고받으며 Data를 교환한다.
TCP는 IETF(Internet Engineering Task Force)에서 공식적으로 정의한 표준이다.(RFC793)
동작
TCP는 아래와 같은 작동을 한다.
- 전송할 Application Data를 Packet으로 분할
- Network Layer에서 Packet를 송신하고 Packet를 수신
- 손실된 Data(Packet)를 재전송 -> 오류없는 Data 전송
- 모든 Packet의 전송 확인
Packet 분할
TCP Protocol Stack은 MTU(Maximum Transmission Unit) 파라미터 값으로 분할 크기를 판단한다.
MTU는 1 Packet으로 운반할 수 있는 Data 최대 길이이다.
Packet에는 Data 말고도 IP Header, TCP Header, FCS 등이 포함된다.
MTU는 Header를 포함한 길이로 Header를 제외한 길이가 Data 최대 길이이다.
Header를 제외한 부분을 MSS(Maximum Segment Size)라 한다.
Network 상에서 전송될 수 있도록 Packet으로 분할하는 것은 Application에서 신경 안 써도 된다.
TCP Header
TCP 다른 동작들을 살펴보기 전에 TCP Header 정보를 살펴보려 한다.
Header의 각종 제어 정보가 담기기 때문이다.
필드 명칭 | 길이(bit) | 설명 |
송신처 Port | 16 | Packet을 송신한 측 Program Port 번호 |
수신처 Port | 16 | Packet을 수신한 측 Program Port 번호 |
Sequence 번호 | 32 | Packet의 맨 앞 Data가 송신 Data의 몇 번째 byte에 해당하는 지 전달하기 위함 |
ACK 번호 | 32 | Data가 어디까지 수신 측에 전달됬는지 수신측에서 송신쪽에 전달 |
Data offset | 4 | Packet 중 Data가 어디부터 시작하는지 전달 |
Control bit | 6 | URG -> 긴급 Pointer가 유효한지 ACK -> Data가 올바르게 도착했다 체크 PSH -> flush 동작에 의해 송신된 Data인지 체크 RST -> 접속을 강제로 종료, 이상 종료시에 사용 SYN -> 송신, 수신측에서 일련번호 서로 확인, 접속 확인 FIN -> 연결 끊기 |
윈도우 | 16 | 수신 확인을 기다리지 않고 묶어서 송신할 수 있는 Data 양 통제 |
체크섬 | 16 | 오류 유무 검사 |
긴급 Pointer | 16 | 긴급으로 처리해야 할 Data 위치 표시 |
옵션 | 가변 길이 | 위 필드 외 제어정보가 추가로 필요할 시 추가 |
3 Way-Handshake
TCP는 Connection 기반 Protocol이다.
Packet이 교환되기 전에 Connection이 성립되고 유지되어야 한다.
일방적으로 보내면 수신하는 쪽에서 준비가 되지 않기 때문이다.
수신하는 쪽에서 통신에 필요한 리소스를 확보하는 작업이 필요하다.
TCP는 3 Way-Handshake 방식으로 Connection을 수립한다.
TCP Protocol를 이용해서 Packet를 보내기 전에 상대방과 Connection을 수립하는 과정이다.
이 과정으로 양쪽에서 Data를 전송할 준비가 되어 있다는 것을 알려준다.
- Client에서 SYN Packet를 Server에 전송(Client : SYN-SENT)
- 송/수신처 Port 정보 + Control bit중 SYN이라는 bit를 1로 만들어 전송
- SYN Packet를 받은 Server는 SYN+ACK Packet를 Client에 전송(Server : SYN-RECEIVED)
- 송/수신처 Port 정보 + SYN(bit 1) + ACK bit 1로 만들어 전송(도착 확인)
- SYN+ACK Packet를 받은 Client는 ACK Packet를 Server에 전송(Client : ESTABLISHED)
- Server 측에서 온 Packet에서 SYN bit 확인 -> 1이면 접속 성공
- Server에 전송이 잘 된 것을 알려주기 위해 다시 Packet 전송
- ACK Packet를 받은 Server는 Data를 전송하게 된다.(Server: ESTABLISHED)
오류 없는 Data 전송
Data를 Packet로 분할하여 전송을 한다.
다양한 원인으로 Packet이 전송이 실패할 수 있다.
TCP에서 전송 실패에 대한 문제를 Sequence 번호와 ACK 번호를 통해서 해결하고 있다.
TCP Header 제어 정보 중에 Sequence 번호가 있다.
Sequence 번호는 현 Packet의 Data가 나눠지기 전 Data 중 몇 번째 Data에 해당하는지 알려준다.
수신한 쪽에서는 Sequence 번호를 확인하고 다음 번호를 ACK 번호에 넣어 송신쪽에 전송한다.
예시. Packet Segment Size : 1460 Bytes인 상황
송신 ---------Sequence Number : 1 인 Packet 전송 -----------> 수신
송신 <---------------- ACK Number : 1461 해서 응답 ---------- 수신
송신 ---------Sequence Number : 1461 인 Packet 전송 -------> 수신
보안을 위해서 Sequence 번호가 1로 시작하지 않고 난수를 통해 결정된다.
송/수신 모두 Sequence 시작 번호를 알아야 하기 때문에 Handshake 할때 같이 전송한다.
(Client에서 SYN Packet을 보낼때 Sequence 시작 번호를 같이 전송)
수신 쪽에서 ACK 번호를 보냄으로써 없는 Data 부분을 알려주고 송신 쪽에서 필요시 재전송을 한다.
1개씩 보내면 데이터 모두 전송하는데 오래 걸릴 수 있다.
한번에 많은 Packet을 보내는 데 대신 통신 장애로 유실 시 많은 Packet을 잃으 수도 있다.
한번에 많은 Packet을 받을 수 있는 Data 크기를 윈도우 사이즈라 한다.
Network 상황에 맞게 윈도우 사이즈를 조절하는 것을 슬라이딩 윈도우라 한다.
필요성
TCP는 Server와 Client 사이에 안전한 전송을 위해 사용된다.
Data 양에 상관없이 무결성을 보장해준다.
이러한 이유로 다른 High-level Protocol에서 Data 전송 시 활용된다.
아래는 모두 TCP/IP Stack의 Application Layer에서 존재하는 Protocol들이다.
- SSH(Secure Hell), FTP(File Transfer Protocol), Telnet
- SMTP(Simple Mail Transfer Protocol), POP(Post Office Protocol), IMAP(Internet Message Access Protocol)
'Network' 카테고리의 다른 글
Router (0) | 2022.03.01 |
---|---|
IP (0) | 2022.03.01 |
HTTP 1.1 vs HTTP 2.0 (0) | 2022.01.07 |
Web Vitals (0) | 2021.12.29 |
CORS (0) | 2021.12.19 |