Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- http
- TIL
- linux
- 정리
- 가상환경
- Go
- 데이터베이스
- PYTHON
- 데이터엔지니어링
- HADOOP
- 데이터 엔지니어링
- airflow
- airflow.cfg
- 데브코스
- Docker
- 운영체제
- 데이터 웨어하우스
- 컴퓨터네트워크
- 파이썬
- S3
- 자료구조
- TCP
- dockerfile
- redshift
- AWS
- 종류
- 컴퓨터 네트워크
- Django
- 데이터 파이프라인
- sql
Archives
- Today
- Total
홍카나의 공부방
[컴퓨터 네트워크] 14-2. TCP의 연결설정(3-way handshake), 데이터 전송, 연결 해제 본문
Computer Network
[컴퓨터 네트워크] 14-2. TCP의 연결설정(3-way handshake), 데이터 전송, 연결 해제
홍문관카페나무 2023. 4. 29. 18:13TCP의 연결 설정 : three-way handshake
- TCP는 연결 지향형 프로토콜로, source와 destination 사이에 가상 연결 통로를 설정하게 된다.
- 가상 연결 통로 설정 방법 중 하나는 three-way handshake이다. 연결 이후 모든 세그먼트는 해당 연결 통로로 전송된다.
- TCP 연결은 Layer2와 다르게 physical이 아닌, virtual(logical) 연결이라는 것도 알아두면서 아래 그림으로 이해해보자.
- 서버가 Passive Open 상태로 연결을 기다린다.
- 클라이언트가 Active Open 상태가 되면서 서버에 패킷을 전송한다.
- 이 과정에서 해당 패킷의 sequence number(첫번째 byte의 번호)는 해킹 방지를 위해 임의로 결정되며, 데이터 없이 헤더만 전송한다. SYN, ACK Flag가 포함된 패킷은 데이터가 없어도 전송된다. 위 그림에서는 8000번으로 SYN이 전송됐다.
- 서버에서 패킷을 받은 후, ACK(8001), SYN+ACK Flag를 담아서 클라이언트로 SYN을 받았다는 응답을 보낸다. 여기서 수신 윈도우 크기(rwnd)도 같이 전송되며, 위 그림에서는 rwnd: 5000으로 초기 수신 버퍼 크기가 5000바이트임을 알렸다. seq#는 역시나 랜덤으로 정해진 숫자인 15000을 보냈다. ACK번호에 +1을 하여 보낸 것은 패킷을 잘 받았다는 것을 표현한 것이다.
- Client에서는 연결을 open하고, 다시 Seq#에 1을 더한 Ack(15001), rwnd:(가용송신버퍼 크기), ACK Flag를 서버에 보낸다.
- 3번째 패킷을 보낼 때는 1번째 송신에서 Data를 전송하지 않고 헤더만 보냈기 때문에, 그전에 보냈던 seq 번호인 8000번을 다시 보낸 것이다. 이는 데이터가 따로 전송되지 않았다는 의미를 전달하기 위함이다.
- 서버에서도 3번째 패킷의 ACK를 확인한 다음, 연결을 open 한다.
요약 : 클라이언트의 SYN에 대해서 SYN+ACK가 전달되고, 또 서버에서 보낸 SYN에 대해서 ACK가 전달된다.
- 핵심은 SYN segment와 SYN+ACK segment가 데이터를 따로 전송하지는 않으나, 시퀸스 번호를 하나 소비한다는 점이다.
- 만약 ACK만 전달 되는 segment도 데이터를 따로 전송하지 않고 헤더만 보낸다면, 시퀸스 번호를 소비하지는 않는다. ( 보냈던 번호로 또 보냄 )
TCP의 데이터 전송
- 아래의 데이터 전송 예시 그림은 연결이 온전히 설정이 되었음을 가정하고 그리는 예시다.
- 위 연결 설정 과정에서 시퀸스 번호 8000번을 소비했기 때문에, 8001번을 첫번째 시퀸스 넘버로 설정해서 데이터를 전송한다.
- 클라이언트에서 패킷을 2번 보내서 8001~9000번 데이타, 9001~10000번 데이타를 보냈는데 서버에서는 패킷을 받을 때마다 굳이 ACK를 하나씩 보내지 않는다. ACK는 Overhead가 발생하는 과정이므로, 어느 정도 패킷을 연속으로 받고 ACK를 보낸다.
- 서버에서도 데이터를 보냈다. 연결 설정때 서버가 seq# 15000번을 소비했기 때문에, seq(15001)로 데이터를 보낸다.
- 마지막 클라이언트가 ACK를 보낼때 seq#를 10000번으로 보냈는데, 데이터를 보내지 않고 ACK Header만 보냈음을 의미한다.
TCP의 연결 해제
- 연결 해제는 연결 설정시 보낸 것과 매우 비슷하게, FIN -> FIN+ACK -> ACK 형태로 통신하게 된다.
- 먼저 끊어 주는 측이 Active Close고, 요청에 응답해서 연결을 끊는 쪽은 Passive Close다.
- 클라이언트든 서버든 FIN에 대한 ACK를 응답받았을 때 Connection이 완벽하게 종료된다.
번외로 한쪽만 송신을 먼저 끝내는 Half-Close 방법도 있는데 이 글에서는 3-way HandShake만 일단 다뤘다.
반응형
'Computer Network' 카테고리의 다른 글
[컴퓨터 네트워크] 15. DNS 개요 (0) | 2023.05.04 |
---|---|
[컴퓨터 네트워크] 14-3. TCP의 흐름제어(+ silly window syndrome), 오류제어, 혼잡제어 (0) | 2023.04.30 |
[컴퓨터 네트워크] 14-1. TCP 개요 (0) | 2023.04.26 |
[컴퓨터 네트워크] 13. UDP 간단 정리 (0) | 2023.04.22 |
[컴퓨터 네트워크] 12. Transport Layer(전송계층)과 포트 번호 vs Process ID, Pushing과 Pulling, UDP 왜써요? (1) | 2023.04.20 |