TCP; Transmission Control Protocol
연결지향형 프로토콜, 즉 송신자와 수신자가 양방향 소통을 한다
패킷을 한 컴퓨터에서 다른 컴퓨터로 전달해주는 IP 프로토콜로,
신뢰성이 요구되는 애플리케이션에서 사용한다
안정적이고, 혼잡 제어와 흐름 제어가 가능하다!
하지만 데이터 전송 순서가 보장되면서 상대적으로 느리다..라는 것
- 연결형 서비스
- byte 스트림으로 연결한다
- 흐름 / 혼잡 제어 O
- 신뢰성 GOOD
- 전이중 방식 (Full-Duplex) : 양방향 동시 전송 가능
- 점대점 (Point to Point) : 1대1, 2개의 종단점
TCP Header
- Source Port, Destination Port : 송/수신자의 포트 번호 주소
- Sequence Number : 시퀀스 번호 - 전송되는 바이트 수를 기준으로 증가
- ACK Number : 응답 번호 - 제대로 수신한 바이트의 수를 응답하기 위함
- Data Offset : 데이터 시작 위치
- Reserved : 예약 필드 - 나중을 위함, 일단 0으로 채워짐
- Flag Bit : 제어 비트 : SYN, ACK, FIN 등 제어번호
- URG
- ACK : 응답 번호 필드가 유효한지 설정
- PSH
- RST
- SYN : 연결 설정으로, 양쪽이 보낸 최초 패킷에만 설정되어야 한다
- FIN : 연결 종료
- Window : 윈도우 크기 - 수신 윈도우 버퍼 크기를 지정
- Checksum : 체크섬 - 데이터 오류 검출용
- Urgent Pointer : 긴급 위치
TCP의 연결 및 해제 과정
TCP Connection (3-way handshake)
- oepn()을 실행한 클라이언트가 SYN을 보내고, SYN_SENT 상태 (대기)
- 서버는 SYN_RCVD로 변경, SYN + 응답 ACK 보냄
- SYN, ACK를 받은 클라이언트는 ESTABLEISHED 상태로 바꾸고 서버에 응답 ACK를 보냄
- 서버는 응답 ACK를 받고 ESTABLISHED 상태로 변경됨
TCP Disconnection (4-way handshake)
- close()를 실행한 클라이언트는 FIN을 보내고 FIN_WAIT1 상태로 대기
- 서버는 CLOSE_WAIT 으로 변경 후 응답 ACK를 전달한다, 그리고 동시에, 해당 포트에 연결된 앱에게 close() 요청
- ACK를 받은 클라이언트는 FIN_WAIT2 상태로 변경
- close() 요청을 받은 서버 앱은 종료 프로세스를 진행, 그리고 FIN을 클라이언트에 보내 LAST_ACK 상태로 바꾼다
- 클라이언트가 FIN을 받으면, ACK를 서버에 다시 전송하고, TIME_WAIT으로 상태를 바꾼다
- TIME_WAIT 에서 일정 시간이 지나면 CLOSED 된다
- ACK를 받은 서버도 포트를 CLOSED 로 닫는다
💡 반드시 서버만 CLOSE_WAIT 상태를 갖지는 않는다!
서버가 먼저 FIN을 보내고 종료 요청을 할 수 있는데, 이럴 땐 서버가 FIN_WAIT1 상태가 된다
UDP; User Datagram Protocol
비 연결지향형 프로토콜 이라는 건데, 쉽게 말해서 송신자의 일방적인 소통이라고 생각하면 되겠다
실시간 유튜브 스트리밍을 생각해보자
송신자는 보내기만 하면 되는 거니까, 수신자에게 데이터가 잘 전송 됐는지는 몰라도 된다 !
그럼 데이터 전송과 순서는 보장되지 않고, 혼잡 제어와 흐름 제어 등을 지원하지 않는다는 것을 유념해야 한다
대신에, UDP는 간단한 데이터를 빠르게 전송할 수 있다
- 비연결형 서비스
- message 스트림으로 연결한다
- 흐름 / 혼잡 제어 X
- 신뢰성은 적음
- 데이터 전송 속도가 빠르다
- 1대1, 1대다, 다대다 통신 가능
UDP 헤더
UDP 헤더를 추가하고, 이를 IP로 보내는데
이 때의 UDP 헤더는 TCP 헤더에 비해 정보가 많이 없다
얘는 송/수신자의 포트 번호, 데이터 길이, Checksum
이 4개의 정보만을 헤더에 담아서, 모두 16bit 로 보낸다!
확실히… 신뢰성을 보장해주는 것 같은 느낌은 안 들지만 간단하고 빠르다는 것
[참고]
https://velog.io/@hidaehyunlee/TCP-%EC%99%80-UDP-%EC%9D%98-%EC%B0%A8%EC%9D%B4
'개발일지 > Spring' 카테고리의 다른 글
[Spring] 스프링 입문 - 회원 관리 예제, 웹 MVC 개발 (0) | 2023.09.28 |
---|---|
[Spring] 스프링 입문 - 스프링 빈과 의존 관계 (1) | 2023.09.28 |
[Spring] 스프링 입문 - 회원 서비스 테스트 (0) | 2023.09.18 |
[Spring] 스프링 입문 - 회원 서비스 개발 (0) | 2023.09.14 |
[Spring] 스프링 입문 - 회원 리포지토리 테스트 케이스 (0) | 2023.09.13 |