티스토리 뷰
TCP(Transmission Control Protocol) 은 연결 지향 프로토콜입니다.
또 데이터가 제대로 보내졌나 확인을 해서 신뢰성을 가지고 있습니다.
통신 하는 과정에서 "손흔들기"절차를 통해서 서로 통신하려는 둘 간의 연결을 제대로 확립시켜야 하는데,
이 과정을 "3-Way Handshake"이라 불리고,
연결을 종료하기 위해서도, 3 Way Handshake 처럼, 4 Way Handshaking이라는 과정을 거친다.
TCP 헤더는 다음과 같습니다.
📍 Flags 참고
SYN(Synchronize Sequence Number)
- 연결 설정
Sequence Number를 랜덤으로 설정하여 세션을 연결하는 데 사용하며, 초기에 Sequence Number를 전송한다.
ACK(Acknowledgement)
- 응답 확인
패킷을 받았다는 것을 의미한다.
Acknowledgement Number 필드가 유효한지를 나타낸다.
양단 프로세스가 쉬지 않고 데이터를 전송한다고 가정하면
최초 연결 설정 과정에서 전송되는 첫 번째 세그먼트를 제외한 모든 세그먼트의 ACK 비트는 1이라 생각할 수 있음
FIN(Finish)
- 연결 해제
세션 연결을 종료시킬 때 사용되며, 더 이상 전송할 데이터가 없음을 의미한다.
3-Way Handshake
예시
TCP는 연결 지향적이라는 특성때문에 통신을 하는 응용 프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미한다.
예를 들어, A 프로세스(Client)가 B 프로세스(Server)에 연결을 요청
- A -> B: SYN(최초 연결)
- 접속 요청 프로세스 A가 연결 요청 메시지 전송 (SYN)
- 송신자가 최초로 데이터를 전송할 때 Sequence Number를 임의의 랜덤 숫자로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트를 전송한다.
- PORT 상태 - B: LISTEN, A: CLOSED
- B -> A: SYN(최초연결) + ACK(응답)
- 접속 요청을 받은 프로세스 B가 요청을 수락했으며, 접속 요청 프로세스인 A도 포트를 열어 달라는 메시지 전송 (SYN + ACK)
- 수신자는 Acknowledgement Number 필드를 (Sequence Number + 1)로 지정하고, SYN과 ACK 플래그 비트를 1로 설정한 세그먼트를 전송한다.
- PORT 상태 - B: SYN_RCV, A: CLOSED
- A -> B: ACK
- PORT 상태 - B: SYN_RCV, A: ESTABLISHED
- 마지막으로 접속 요청 프로세스 A가 수락 확인을 보내 연결을 맺음 (ACK)
- 이때, 전송할 데이터가 있으면 이 단계에서 데이터를 전송할 수 있다.
- PORT 상태 - B: ESTABLISHED, A: ESTABLISHED
4Way Handshake
예시
- A(cli)-> B(ser) : FIN+ACK (종료)
- 프로세스 A가 연결 해제 메시지 전송
- server가 받기를 기대하는 마지막 패킷 ACK 넘버를 sequence Number로 지정하고 FIN에는 전 패킷의 응답 ACK 넘버를 지정
- PORT 상태 - A: FIN_WAIT1 , B: CLOSE_WAIT
- B -> A: ACK / ACK,FIN
- 맨처음에 FIN에 대한 응답코드 ACK( FIN sequence Number+1) 을 클라이언트쪽으로 전송
- 그 후 FIN (client에서 준 ACK 을 sequence Number로 지정) 과 ACK(1단계에서 보냈던 sequence Number 지정) 전송
- PORT 상태 - A: FIN_WAIT2, B: LASK_ACK
- A -> B: ACK
- 마지막으로 A가 서버에서 온 FIN 에 대한 응답 ACK(FIN sequence Number +1)을 전송
- 이때, 클라이언트쪽에서 대기하다가 PORT 상태를 CLOSED로 바꾸면서 통신 종료
- PORT 상태 - A:TIME_WAIT....->CLOSED B: CLOSED
반응형
'인프라 > Network' 카테고리의 다른 글
[VirtualBox] 호스트 네트워크 관리자 뜨지 않는 문제 - 성공 (0) | 2022.01.10 |
---|---|
[Network] Handshake 문제 풀어보기 (3) | 2022.01.07 |
[Network] IPv4 패킷 구조와 삽질 (0) | 2022.01.06 |
[Network] 네트워크를 효율적으로 관리하기 - 서브넷팅 & 슈퍼넷팅 (0) | 2022.01.06 |
[Network] 라우팅 프로토콜 - RIP,OSPF (0) | 2022.01.05 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Spring Boot
- 초보
- spring
- 계층
- java
- Docker
- osi7계층
- 3Way Handshake
- 라우터
- 프로토콜
- 삽질
- 네트워크
- tcp
- 라우팅
- 개발
- dto
- ec2
- s3
- 개발자
- 프로그래머스
- rds
- lambda
- 스프링
- .NET
- SpringBoot
- 회고
- 스위치
- 자바
- 회고록
- aws
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함