일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- #크랙미 5번
- #크랙미 10번
- #크랙미 9번
- #크랙미2번
- Easy
- GraphQL
- java
- java8
- #심플즈
- #크랙미
- springframework
- #abex크랙미4번
- #abex
- #심플즈 크랙미
- 리버싱
- #고클린
- #보안이슈
- #파밍
- #보안뉴스
- #리버싱
- #크랙미4번
- #크랙미3번
- #abex크랙미
- Spring
- leetcode
- Today
- Total
Halo World
TCP 3-way handshaking 연결과정 및 4-way handshaking 연결종료과정 본문
| TCP
- TCP는 UDP와 달리 연결-지향 전송프로토콜로써 물리적 연결이 아닌 가상적 연결을 이용하여 통신
- 신뢰성 있는 서비스를 제공
- 패킷을 '세그먼트'라고 부름
- 세그먼트는 20~60 바이트의 헤더와 응용 프로그램으로부터 온 데이터로 구성
- 헤더는 선택항목이 없다면 20바이트이며, 선택항목이 있다면 60바이트까지임
| TCP 연결
- 연결 설정, 데이터 전송 및 연결 종료의 3단계를 필요로하고 이를 3-way handshaking(세 방향 핸드셰이크)라고 부른다.
> 3단계 연결 절차
1) 클라이언트는 SYN 플래그만 설정되어있는 첫 번째 세그먼트인 SYN 세그먼트를 전송
* 세그먼트는 순서번호들의 동기화를 위한 것
(이때, SYN 세그먼트는 데이터를 운반할 수 없으나 순서번호 1개를 소비)
2) 서버는 2개의 플래그 비트가 설정된 두 번째 세그먼트인 SYN+ACK 세그먼트를 전송
(SYN+ACK 세그먼트는 데이터를 운반할 수 없으며 순서번호 1개 소비)
3) 클라이언트가 세 번째 세그먼트를 전송 (ACK 세그먼트)
ACK 플래그와 확인응답 번호 필드를 사용 (두 번째 세그먼트를 수신한 것에 대한 확인응답)
(데이터를 운반하지 않는다면 ACK 세그먼트는 순서번호를 소비하지 않음)
> 데이터 전송
- 연결이 설정된 후에 양방향으로 데이터 전송이 발생
(클라이언트와 서버 모두 데이터와 확인응답 전송 가능)
- 클라이언트에 의해 보내진 데이터 세그먼트에는 PSH(push) 플래그가 설정되어있음
(서버 TCP가 데이터가 수신되자마자 서버 프로세스에게 데이터를 전달하는 것을 알도록 하기 위해)
- 서버로부터 온 세그먼트는 PSH 플래그를 설정하지 않음
> 연결 종료
- 대부분 클라이언트가 종료하지만, 서버와 클라이언트 모두 종료 가능
- 종료 방법
1) 3-way handshaking
- 클라이언트 TCP는 클라이언트 프로세스로부터 종료 명령을 수신한 후 FIN 플래그가 설정된 첫 번째 FIN 세그먼트를 전송
- 수신한 서버 TCP는 상황에 대한 처리를 알리고 클라이언트로부터 온 FIN 세그먼트 수신에 대해 확인하기위해 ACK 세그먼트를 클라이언트에게 송신
- 서버 TCP 서버 프로세스로부터 종료 명령을 수신한 후 FIN 플래그가 설정된 FIN 세그먼트를 전송
- 클라이언트 TCP는 TCP 서버로부터 FIN 세그먼트 수신에 대한 확인으로 마지막 세그먼트인 ACK 세그먼트를 전송
2) 절반-폐쇄
- TCP에서 데이터를 받고 있는 도중에 한쪽이 데이터 전송을 중단하는 것 (대부분 클라이언트에서 중단)
- 클라이언트는 FIN 세그먼트를 전송함으로써 연결을 절반 폐쇄하고, 서버는 ACK 세그먼트를 송신함으로써 이를 받아들임
-> 이 경우 클라이언트에서 서버로의 데이터 전송을 멈추지만, 서버는 여전히 데이터 송신 가능
-> 서버가 데이터를 다 전송하고 FIN 세그먼트를 보낼 경우, 클라이언트는 ACK 세그먼트 전송 가능
* 그림 출처 : http://www.ktword.co.kr/abbr_view.php?nav=2&m_temp1=1901&id=995